mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'devel' of https://github.com/arangodb/arangodb into vpack
This commit is contained in:
commit
b08e1a76bc
|
@ -45,12 +45,16 @@ namespace arangodb {
|
|||
AttributeTranslator& operator= (AttributeTranslator const&) = delete;
|
||||
|
||||
AttributeTranslator ()
|
||||
: _builder() {
|
||||
: _builder(), _count(0) {
|
||||
}
|
||||
|
||||
~AttributeTranslator () {
|
||||
}
|
||||
|
||||
size_t count () const {
|
||||
return _count;
|
||||
}
|
||||
|
||||
void add (std::string const& key, uint64_t id);
|
||||
|
||||
void seal ();
|
||||
|
@ -58,14 +62,18 @@ namespace arangodb {
|
|||
// translate from string to id
|
||||
uint8_t const* translate (std::string const& key) const;
|
||||
|
||||
// translate from string to id
|
||||
uint8_t const* translate (char const* key, ValueLength length) const;
|
||||
|
||||
// translate from id to string
|
||||
uint8_t const* translate (uint64_t id) const;
|
||||
|
||||
|
||||
private:
|
||||
|
||||
std::unique_ptr<Builder> _builder;
|
||||
std::unordered_map<std::string, uint8_t const*> _keyToId;
|
||||
std::unordered_map<uint64_t, uint8_t const*> _idToKey;
|
||||
size_t _count;
|
||||
};
|
||||
|
||||
} // namespace arangodb::velocypack
|
||||
|
|
|
@ -138,6 +138,7 @@ namespace arangodb {
|
|||
_size = _buffer->size();
|
||||
|
||||
VELOCYPACK_ASSERT(options != nullptr);
|
||||
|
||||
if (options == nullptr) {
|
||||
throw Exception(Exception::InternalError, "Options cannot be a nullptr");
|
||||
}
|
||||
|
@ -151,6 +152,7 @@ namespace arangodb {
|
|||
_size = _buffer->size();
|
||||
|
||||
VELOCYPACK_ASSERT(options != nullptr);
|
||||
|
||||
if (options == nullptr) {
|
||||
throw Exception(Exception::InternalError, "Options cannot be a nullptr");
|
||||
}
|
||||
|
@ -238,11 +240,8 @@ namespace arangodb {
|
|||
|
||||
static Builder clone (Slice const& slice, Options const* options = &Options::Defaults) {
|
||||
VELOCYPACK_ASSERT(options != nullptr);
|
||||
if (options == nullptr) {
|
||||
throw Exception(Exception::InternalError, "Options cannot be a nullptr");
|
||||
}
|
||||
Builder b;
|
||||
b.options = options;
|
||||
|
||||
Builder b(options);
|
||||
b.add(slice);
|
||||
return std::move(b);
|
||||
}
|
||||
|
@ -310,25 +309,37 @@ namespace arangodb {
|
|||
Slice getKey (std::string const& key) const;
|
||||
|
||||
// Syntactic sugar for add:
|
||||
Builder& operator() (std::string const& attrName, Value sub) {
|
||||
Builder& operator() (std::string const& attrName, Value const& sub) {
|
||||
add(attrName, sub);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Syntactic sugar for add:
|
||||
Builder& operator() (std::string const& attrName, ValuePair sub) {
|
||||
Builder& operator() (std::string const& attrName, ValuePair const& sub) {
|
||||
add(attrName, sub);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Syntactic sugar for add:
|
||||
Builder& operator() (Value sub) {
|
||||
Builder& operator() (std::string const& attrName, Slice const& sub) {
|
||||
add(attrName, sub);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Syntactic sugar for add:
|
||||
Builder& operator() (Value const& sub) {
|
||||
add(sub);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Syntactic sugar for add:
|
||||
Builder& operator() (ValuePair sub) {
|
||||
Builder& operator() (ValuePair const& sub) {
|
||||
add(sub);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Syntactic sugar for add:
|
||||
Builder& operator() (Slice const& sub) {
|
||||
add(sub);
|
||||
return *this;
|
||||
}
|
||||
|
@ -450,6 +461,7 @@ namespace arangodb {
|
|||
if (options->attributeTranslator != nullptr) {
|
||||
// check if a translation for the attribute name exists
|
||||
uint8_t const* translated = options->attributeTranslator->translate(attrName);
|
||||
|
||||
if (translated != nullptr) {
|
||||
set(Slice(options->attributeTranslator->translate(attrName), options));
|
||||
return set(sub);
|
||||
|
|
|
@ -43,7 +43,14 @@ namespace arangodb {
|
|||
|
||||
public:
|
||||
|
||||
enum VisitationOrder {
|
||||
PreOrder = 1,
|
||||
PostOrder = 2
|
||||
};
|
||||
|
||||
Collection () = delete;
|
||||
Collection (Collection const&) = delete;
|
||||
Collection& operator= (Collection const&) = delete;
|
||||
|
||||
static void forEach (Slice const& slice, std::function<bool(Slice const&, ValueLength)> const& cb);
|
||||
|
||||
|
@ -134,6 +141,12 @@ namespace arangodb {
|
|||
static Builder merge (Slice const* left, Slice const* right, bool mergeValues) {
|
||||
return merge(*left, *right, mergeValues);
|
||||
}
|
||||
|
||||
static void visitRecursive (Slice const& slice, VisitationOrder order, std::function<bool(Slice const&, Slice const&)> const& func);
|
||||
|
||||
static void visitRecursive (Slice const* slice, VisitationOrder order, std::function<bool(Slice const&, Slice const&)> const& func) {
|
||||
visitRecursive(*slice, order, func);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace arangodb::velocypack
|
||||
|
|
|
@ -124,13 +124,13 @@ namespace arangodb {
|
|||
case KeyNotFound:
|
||||
return "Key not found";
|
||||
case BuilderNotSealed:
|
||||
return "Builder object not yet sealed";
|
||||
return "Builder value not yet sealed";
|
||||
case BuilderNeedOpenObject:
|
||||
return "Need open Object";
|
||||
case BuilderNeedOpenArray:
|
||||
return "Need open Array";
|
||||
case BuilderNeedSubvalue:
|
||||
return "Need subvalue in current object or array";
|
||||
return "Need subvalue in current Object or Array";
|
||||
case BuilderNeedOpenCompound:
|
||||
return "Need open compound value (Array or Object)";
|
||||
case BuilderUnexpectedType:
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#define VELOCYPACK_ITERATOR_H 1
|
||||
|
||||
#include <iosfwd>
|
||||
#include <functional>
|
||||
|
||||
#include "velocypack/velocypack-common.h"
|
||||
#include "velocypack/Exception.h"
|
||||
|
|
|
@ -101,21 +101,21 @@ namespace arangodb {
|
|||
: _start(nullptr), _size(0), _pos(0), _nesting(0), options(options) {
|
||||
|
||||
VELOCYPACK_ASSERT(options != nullptr);
|
||||
|
||||
if (options == nullptr) {
|
||||
throw Exception(Exception::InternalError, "Options cannot be a nullptr");
|
||||
}
|
||||
_b.options = options;
|
||||
}
|
||||
|
||||
static Builder fromJson (std::string const& json, Options const* options = &Options::Defaults) {
|
||||
Parser parser;
|
||||
parser.options = options;
|
||||
Parser parser(options);
|
||||
parser.parse(json);
|
||||
return parser.steal();
|
||||
}
|
||||
|
||||
static Builder fromJson (uint8_t const* start, size_t size, Options const* options = &Options::Defaults) {
|
||||
Parser parser;
|
||||
parser.options = options;
|
||||
Parser parser(options);
|
||||
parser.parse(start, size);
|
||||
return parser.steal();
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <vector>
|
||||
#include <iosfwd>
|
||||
#include <algorithm>
|
||||
#include <type_traits>
|
||||
|
||||
#include "velocypack/velocypack-common.h"
|
||||
#include "velocypack/Exception.h"
|
||||
|
@ -719,24 +720,6 @@ namespace arangodb {
|
|||
VELOCYPACK_ASSERT(this->type() == type);
|
||||
}
|
||||
#endif
|
||||
|
||||
// read an unsigned little endian integer value of the
|
||||
// specified length, starting at the specified byte offset
|
||||
template <typename T>
|
||||
T readInteger (uint8_t const* start, ValueLength numBytes) const {
|
||||
T value = 0;
|
||||
uint8_t const* p = start;
|
||||
uint8_t const* e = p + numBytes;
|
||||
T digit = 0;
|
||||
|
||||
while (p < e) {
|
||||
value += static_cast<T>(*p) << (digit * 8);
|
||||
++digit;
|
||||
++p;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
// extracts a value from the slice and converts it into a
|
||||
// built-in type
|
||||
|
|
|
@ -156,17 +156,24 @@ namespace arangodb {
|
|||
: static_cast<int64_t>(v);
|
||||
}
|
||||
|
||||
static inline uint64_t readUInt64 (uint8_t const* start) throw() {
|
||||
// read an unsigned little endian integer value of the
|
||||
// specified length, starting at the specified byte offset
|
||||
template<typename T>
|
||||
static inline T readInteger (uint8_t const* start, ValueLength length) throw() {
|
||||
uint64_t value = 0;
|
||||
uint64_t x = 0;
|
||||
uint8_t const* end = start + 8;
|
||||
uint8_t const* end = start + length;
|
||||
do {
|
||||
value += static_cast<uint64_t>(*start++) << x;
|
||||
value += static_cast<T>(*start++) << x;
|
||||
x += 8;
|
||||
}
|
||||
while (start < end);
|
||||
return value;
|
||||
}
|
||||
|
||||
static inline uint64_t readUInt64 (uint8_t const* start) throw() {
|
||||
return readInteger<uint64_t>(start, 8);
|
||||
}
|
||||
|
||||
static inline void storeUInt64 (uint8_t* start, uint64_t value) throw() {
|
||||
uint8_t const* end = start + 8;
|
||||
|
|
|
@ -40,6 +40,7 @@ void AttributeTranslator::add (std::string const& key, uint64_t id) {
|
|||
}
|
||||
|
||||
_builder->add(key, Value(id));
|
||||
_count++;
|
||||
}
|
||||
|
||||
void AttributeTranslator::seal () {
|
||||
|
@ -52,6 +53,7 @@ void AttributeTranslator::seal () {
|
|||
Slice s(_builder->slice());
|
||||
|
||||
ObjectIterator it(s);
|
||||
|
||||
while (it.valid()) {
|
||||
_keyToId.emplace(it.key().copyString(), it.value().begin());
|
||||
_idToKey.emplace(it.value().getUInt(), it.key().begin());
|
||||
|
@ -70,6 +72,17 @@ uint8_t const* AttributeTranslator::translate (std::string const& key) const {
|
|||
return (*it).second;
|
||||
}
|
||||
|
||||
// translate from string to id
|
||||
uint8_t const* AttributeTranslator::translate (char const* key, ValueLength length) const {
|
||||
auto it = _keyToId.find(std::string(key, length));
|
||||
|
||||
if (it == _keyToId.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return (*it).second;
|
||||
}
|
||||
|
||||
// translate from id to string
|
||||
uint8_t const* AttributeTranslator::translate (uint64_t id) const {
|
||||
auto it = _idToKey.find(id);
|
||||
|
|
|
@ -745,25 +745,25 @@ uint8_t* Builder::add (std::string const& attrName, Value const& sub) {
|
|||
return addInternal<Value>(attrName, sub);
|
||||
}
|
||||
|
||||
uint8_t* Builder::add (std::string const& attrName, Slice const& sub) {
|
||||
return addInternal<Slice>(attrName, sub);
|
||||
}
|
||||
|
||||
uint8_t* Builder::add (std::string const& attrName, ValuePair const& sub) {
|
||||
return addInternal<ValuePair>(attrName, sub);
|
||||
}
|
||||
|
||||
uint8_t* Builder::add (std::string const& attrName, Slice const& sub) {
|
||||
return addInternal<Slice>(attrName, sub);
|
||||
}
|
||||
|
||||
uint8_t* Builder::add (Value const& sub) {
|
||||
return addInternal<Value>(sub);
|
||||
}
|
||||
|
||||
uint8_t* Builder::add (Slice const& sub) {
|
||||
return addInternal<Slice>(sub);
|
||||
}
|
||||
|
||||
uint8_t* Builder::add (ValuePair const& sub) {
|
||||
return addInternal<ValuePair>(sub);
|
||||
}
|
||||
|
||||
uint8_t* Builder::add (Slice const& sub) {
|
||||
return addInternal<Slice>(sub);
|
||||
}
|
||||
|
||||
static_assert(sizeof(double) == 8, "double is not 8 bytes");
|
||||
|
||||
|
|
|
@ -325,3 +325,88 @@ Builder Collection::merge (Slice const& left, Slice const& right, bool mergeValu
|
|||
return b;
|
||||
}
|
||||
|
||||
template<Collection::VisitationOrder order>
|
||||
static bool doVisit (Slice const& slice, std::function<bool(Slice const& key, Slice const& value)> const& func);
|
||||
|
||||
template<Collection::VisitationOrder order>
|
||||
static bool visitObject (Slice const& value, std::function<bool(Slice const& key, Slice const& value)> const& func) {
|
||||
ObjectIterator it(value);
|
||||
|
||||
while (it.valid()) {
|
||||
// sub-object?
|
||||
Slice v = it.value();
|
||||
bool const isCompound = (v.isObject() || v.isArray());
|
||||
|
||||
if (isCompound && order == Collection::PreOrder) {
|
||||
if (! doVisit<order>(v, func)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! func(it.key(), v)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isCompound && order == Collection::PostOrder) {
|
||||
if (! doVisit<order>(v, func)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
it.next();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template<Collection::VisitationOrder order>
|
||||
static bool visitArray (Slice const& value, std::function<bool(Slice const& key, Slice const& value)> const& func) {
|
||||
ArrayIterator it(value);
|
||||
|
||||
while (it.valid()) {
|
||||
// sub-object?
|
||||
Slice v = it.value();
|
||||
bool const isCompound = (v.isObject() || v.isArray());
|
||||
|
||||
if (isCompound && order == Collection::PreOrder) {
|
||||
if (! doVisit<order>(v, func)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! func(Slice(), v)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isCompound && order == Collection::PostOrder) {
|
||||
if (! doVisit<order>(v, func)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
it.next();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template<Collection::VisitationOrder order>
|
||||
static bool doVisit (Slice const& slice, std::function<bool(Slice const& key, Slice const& value)> const& func) {
|
||||
if (slice.isObject()) {
|
||||
return visitObject<order>(slice, func);
|
||||
}
|
||||
if (slice.isArray()) {
|
||||
return visitArray<order>(slice, func);
|
||||
}
|
||||
|
||||
throw Exception(Exception::InvalidValueType, "Expecting type Object or Array");
|
||||
}
|
||||
|
||||
void Collection::visitRecursive (Slice const& slice, Collection::VisitationOrder order, std::function<bool(Slice const&, Slice const&)> const& func) {
|
||||
if (order == Collection::PreOrder) {
|
||||
doVisit<Collection::PreOrder>(slice, func);
|
||||
}
|
||||
else {
|
||||
doVisit<Collection::PostOrder>(slice, func);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -144,6 +144,7 @@ void Parser::parseNumber () {
|
|||
}
|
||||
return;
|
||||
}
|
||||
|
||||
double fractionalPart;
|
||||
if (i == '.') {
|
||||
// fraction. skip over '.'
|
||||
|
@ -479,16 +480,35 @@ void Parser::parseObject () {
|
|||
|
||||
_b.reportAdd(base);
|
||||
bool excludeAttribute = false;
|
||||
auto const lastPos = _b._pos;
|
||||
if (options->attributeExcludeHandler == nullptr) {
|
||||
parseString();
|
||||
}
|
||||
else {
|
||||
auto lastPos = _b._pos;
|
||||
parseString();
|
||||
if (options->attributeExcludeHandler->shouldExclude(Slice(_b._start + lastPos, options), _nesting)) {
|
||||
excludeAttribute = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (! excludeAttribute && options->attributeTranslator != nullptr) {
|
||||
// check if a translation for the attribute name exists
|
||||
Slice key(_b._start + lastPos, options);
|
||||
|
||||
if (key.isString()) {
|
||||
ValueLength keyLength;
|
||||
char const* p = key.getString(keyLength);
|
||||
uint8_t const* translated = options->attributeTranslator->translate(p, keyLength);
|
||||
|
||||
if (translated != nullptr) {
|
||||
// found translation... now reset position to old key position
|
||||
// and simply overwrite the existing key with the numeric translation id
|
||||
_b._pos = lastPos;
|
||||
_b.addUInt(Slice(translated, options).getUInt());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i = skipWhiteSpace("Expecting ':'");
|
||||
// always expecting the ':' here
|
||||
if (i != ':') {
|
||||
|
|
15
CHANGELOG
15
CHANGELOG
|
@ -1,7 +1,18 @@
|
|||
v2.8.0 (XXXX-XX-XX)
|
||||
-------------------
|
||||
|
||||
* web interface: aql editor now supports bind parameters
|
||||
* return HTTP status code 410 (gone) instead of HTTP 408 (request timeout) for
|
||||
server-side operations that are canceled / killed. Sending 410 instead of 408
|
||||
prevents clients from re-starting the same (canceled) operation. Google Chrome
|
||||
for example sends the HTTP request again in case it is responded with an HTTP
|
||||
408, and this is exactly the opposite of the desired behavior when an operation
|
||||
is canceled / killed by the user.
|
||||
|
||||
* web interface: queries in AQL editor now cancelable
|
||||
|
||||
* web interface: dashboard - added replication information
|
||||
|
||||
* web interface: AQL editor now supports bind parameters
|
||||
|
||||
* added startup option `--server.hide-product-header` to make the server not send
|
||||
the HTTP response header `"Server: ArangoDB"` in its HTTP responses. By default,
|
||||
|
@ -24,10 +35,10 @@ v2.8.0 (XXXX-XX-XX)
|
|||
- ABS
|
||||
- APPEND
|
||||
- COLLECTIONS
|
||||
- CONTAINS
|
||||
- CURRENT_DATABASE
|
||||
- DOCUMENT
|
||||
- EDGES
|
||||
- FIRST
|
||||
- FIRST_DOCUMENT
|
||||
- FIRST_LIST
|
||||
- FLATTEN
|
||||
|
|
|
@ -7,53 +7,23 @@ for details.
|
|||
|
||||
Please follow these guidelines if you want to contribute to ArangoDB:
|
||||
|
||||
Getting started
|
||||
---------------
|
||||
|
||||
* Please make sure you have a GitHub account
|
||||
|
||||
* Please look into the ArangoDB issue tracker on GitHub for similar/identical
|
||||
issues.
|
||||
|
||||
* For bugs: if the bug you found is not yet described in an existing
|
||||
issue, please file a new one. The new issue should include a clear
|
||||
description of the bug and how to reproduce it (including your
|
||||
environment).
|
||||
|
||||
* For feature requests: please clearly describe the proposed feature, additional
|
||||
configuration options, and side effects.
|
||||
|
||||
* Please let us know if you plan to work on a ticket. This way we can make sure
|
||||
we avoid redundant work.
|
||||
|
||||
* Create a fork of our repository. You can use GitHub to do this.
|
||||
|
||||
* Clone the fork to your development box and pull the latest changes from the
|
||||
ArangoDB repository. Please make sure to use the appropriate branch:
|
||||
|
||||
* the **devel** branch is normally used for new features
|
||||
|
||||
* bug fixes should be done in the **devel** branch first, before being applied to
|
||||
master or other branches.
|
||||
|
||||
* If missing, install the required prerequisites. They are listed
|
||||
[in the manual](https://docs.arangodb.com/Installing/Compiling.html).
|
||||
|
||||
* configure and make your local clone. If you intend to modify the parser files,
|
||||
please make sure to activate the --enable-maintainer-mode configure option. In
|
||||
this case, you also need to have Python installed.
|
||||
|
||||
* Make sure the unmodified clone works locally before making any code
|
||||
changes. You can do so by running the included test suite (i.e. make
|
||||
unittests)
|
||||
|
||||
* If you intend to do documentation changes, you also must install Doxygen in
|
||||
the most recent version.
|
||||
|
||||
Making Changes
|
||||
Reporting Bugs
|
||||
--------------
|
||||
|
||||
* Create a new branch in your fork
|
||||
When reporting bugs, please use our issue tracker on GitHub. Please make sure
|
||||
to include the version number of ArangoDB in your bug report, along with the
|
||||
platform you are using (e.g. `Linux OpenSuSE x86_64`). Please also include the
|
||||
ArangoDB startup mode (daemon, console, supervisor mode) plus any special
|
||||
configuration. This will help us reproducing and finding bugs.
|
||||
|
||||
Please also take the time to check there are no similar/identical issues open
|
||||
yet.
|
||||
|
||||
|
||||
Contributing features, documentation, tests
|
||||
-------------------------------------------
|
||||
|
||||
* Create a new branch in your fork, based on the **devel** branch
|
||||
|
||||
* Develop and test your modifications there
|
||||
|
||||
|
@ -70,22 +40,20 @@ Making Changes
|
|||
editor or a browser. We recently agreed that future documentation should be
|
||||
written in American English (AE).
|
||||
|
||||
* When done, run the complete test suite and make sure all tests pass.
|
||||
* When done, run the complete test suite and make sure all tests pass. You can
|
||||
check [README_maintainers.md](README_maintainers.md) for test run instructions.
|
||||
|
||||
* When finished, push the changes to your GitHub repository and send a pull
|
||||
request from your fork to the ArangoDB repository. Please make sure to select
|
||||
the appropriate branches there. This will most likely be **devel**.
|
||||
|
||||
* You must use the Apache License for your changes.
|
||||
* You must use the Apache License for your changes and have signed our
|
||||
[CLA](https://www.arangodb.com/documents/cla.pdf). We cannot accept pull requests
|
||||
from contributors that didn't sign the CLA.
|
||||
|
||||
Reporting Bugs
|
||||
--------------
|
||||
* Please let us know if you plan to work on a ticket. This way we can make sure
|
||||
redundant work is avoided.
|
||||
|
||||
When reporting bugs, please use our issue tracker on GitHub. Please make sure
|
||||
to include the version number of ArangoDB in your bug report, along with the
|
||||
platform you are using (e.g. `Linux OpenSuSE x86_64`). Please also include the
|
||||
ArangoDB startup mode (daemon, console, supervisor mode) plus any special
|
||||
configuration. This will help us reproducing and finding bugs.
|
||||
|
||||
Additional Resources
|
||||
--------------------
|
||||
|
|
|
@ -22,6 +22,10 @@ Key features include:
|
|||
* It is **open source** (Apache License 2.0)
|
||||
|
||||
In this documentation you can inform yourself about all the functions, features and programs ArangoDB provides for you.
|
||||
Features are ilustrated with interactive usage examples; you can cut'n'paste them into [arangosh](Arangosh/README.md) to try them out.
|
||||
The http REST-API is demonstrated with cut'n'paste recepies intended to be used with the [cURL](http://curl.haxx.se).
|
||||
Drivers may provide their own examples based on these .js based examples to improve understandeability for their respective users.
|
||||
I.e. for the [java driver](https://github.com/arangodb/arangodb-java-driver#learn-more) some of the samples are re-implemented.
|
||||
|
||||
You can also go to our [cookbook](https://docs.arangodb.com/cookbook) and look through some recipes to learn more about ArangoDB specific problems and solutions.
|
||||
|
||||
|
|
|
@ -2,12 +2,17 @@
|
|||
set -e
|
||||
|
||||
echo
|
||||
echo '$0: loading precompiled libraries'
|
||||
echo "$0: loading precompiled libraries"
|
||||
|
||||
wget -q -O - "https://www.arangodb.com/support-files/travisCI/precompiled-libraries-4.3.61.tar.gz" | tar xzf -
|
||||
wget --help
|
||||
wget \
|
||||
-O 3rdParty.tar.gz --progress=dot --show-progress \
|
||||
"https://www.arangodb.com/support-files/travisCI/precompiled-libraries-4.3.61.tar.gz"
|
||||
|
||||
tar xzf 3rdParty.tar.gz
|
||||
|
||||
echo
|
||||
echo '$0: setup make-system'
|
||||
echo "$0: setup make-system"
|
||||
|
||||
make setup || exit 1
|
||||
|
||||
|
|
|
@ -225,8 +225,8 @@ describe ArangoDB do
|
|||
sleep 5
|
||||
|
||||
cmd = "/_api/job/" + id
|
||||
doc = ArangoDB.log_put("#{prefix}-create-cursor-check-status-408", cmd)
|
||||
doc.code.should eq(408)
|
||||
doc = ArangoDB.log_put("#{prefix}-create-cursor-check-status-410", cmd)
|
||||
doc.code.should eq(410)
|
||||
end
|
||||
|
||||
it "checks whether we can cancel an AQL query" do
|
||||
|
@ -253,8 +253,8 @@ describe ArangoDB do
|
|||
sleep 5
|
||||
|
||||
cmd = "/_api/job/" + id
|
||||
doc = ArangoDB.log_put("#{prefix}-create-cursor-check-status-408", cmd)
|
||||
doc.code.should eq(408)
|
||||
doc = ArangoDB.log_put("#{prefix}-create-cursor-check-status-410", cmd)
|
||||
doc.code.should eq(410)
|
||||
end
|
||||
|
||||
it "checks whether we can cancel an AQL query" do
|
||||
|
@ -279,8 +279,8 @@ describe ArangoDB do
|
|||
sleep 5
|
||||
|
||||
cmd = "/_api/job/" + id
|
||||
doc = ArangoDB.log_put("#{prefix}-create-cursor-check-status-408", cmd)
|
||||
doc.code.should eq(408)
|
||||
doc = ArangoDB.log_put("#{prefix}-create-cursor-check-status-410", cmd)
|
||||
doc.code.should eq(410)
|
||||
end
|
||||
|
||||
it "checks whether we can cancel a transaction" do
|
||||
|
@ -309,8 +309,8 @@ describe ArangoDB do
|
|||
sleep 5
|
||||
|
||||
cmd = "/_api/job/" + id
|
||||
doc = ArangoDB.log_put("#{prefix}-create-transaction-check-status-408", cmd)
|
||||
doc.code.should eq(408)
|
||||
doc = ArangoDB.log_put("#{prefix}-create-transaction-check-status-410", cmd)
|
||||
doc.code.should eq(410)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -138,13 +138,13 @@ void RestBaseHandler::generateCanceled () {
|
|||
try {
|
||||
builder.add(VPackValue(VPackValueType::Object));
|
||||
builder.add("error", VPackValue(true));
|
||||
builder.add("code", VPackValue((int32_t) HttpResponse::REQUEST_TIMEOUT));
|
||||
builder.add("code", VPackValue((int32_t) HttpResponse::GONE));
|
||||
builder.add("errorNum", VPackValue((int32_t) TRI_ERROR_REQUEST_CANCELED));
|
||||
builder.add("errorMessage", VPackValue("request canceled"));
|
||||
builder.close();
|
||||
|
||||
VPackSlice slice(builder.start());
|
||||
generateResult(HttpResponse::REQUEST_TIMEOUT, slice);
|
||||
generateResult(HttpResponse::GONE, slice);
|
||||
}
|
||||
catch (...) {
|
||||
generateError(HttpResponse::SERVER_ERROR,
|
||||
|
|
|
@ -176,7 +176,10 @@ controller.post("/query/explain", function(req, res) {
|
|||
if (query.length > 0) {
|
||||
try {
|
||||
if (bindVars) {
|
||||
explain = require("org/arangodb/aql/explainer").explain(query, {colors: false}, false, bindVars);
|
||||
explain = require("org/arangodb/aql/explainer").explain({
|
||||
query: query,
|
||||
bindVars: bindVars
|
||||
}, {colors: false}, false, bindVars);
|
||||
}
|
||||
else {
|
||||
explain = require("org/arangodb/aql/explainer").explain(query, {colors: false}, false);
|
||||
|
|
|
@ -133,6 +133,83 @@
|
|||
<div class="dashboard-row">
|
||||
<% mediumChart("pageFaultsChart", "Major Page Faults") %>
|
||||
<% mediumChart("systemUserTimeChart", "Used CPU Time per Second") %>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-headerbar headerBar">
|
||||
<a class="arangoHeader">Replication</a>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-row">
|
||||
<div class="dashboard-full-width-chart" id="replication-chart">
|
||||
<div class="dashboard-full-width-chart-inner">
|
||||
<div id="repl-numbers" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Numbers</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Events</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Requests</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-ticks" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Ticks</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Applied</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Processed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Available</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-progress" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Progress</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Message</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dashboard-sub-bar"">Replication</div>
|
||||
</div>
|
||||
</div></script><script id="modalBase.ejs" type="text/template"><div id="modal-dialog" class="modal hide fade createModalDialog" tabindex="-1" role="dialog"
|
||||
aria-labelledby="myModalLabel" aria-hidden="true">
|
||||
<% if (title !== null) { %>
|
||||
|
|
Binary file not shown.
|
@ -148,6 +148,84 @@
|
|||
<% mediumChart("pageFaultsChart", "Major Page Faults") %>
|
||||
<% mediumChart("systemUserTimeChart", "Used CPU Time per Second") %>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-headerbar headerBar">
|
||||
<a class="arangoHeader">Replication</a>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-row">
|
||||
<div class="dashboard-full-width-chart" id="replication-chart">
|
||||
<div class="dashboard-full-width-chart-inner">
|
||||
<div id="repl-numbers" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Numbers</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Events</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Requests</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-ticks" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Ticks</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Applied</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Processed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Available</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-progress" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Progress</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Message</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dashboard-sub-bar"">Replication</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</script>
|
||||
|
||||
<script id="modalBase.ejs" type="text/template">
|
||||
|
|
|
@ -2173,6 +2173,58 @@ window.StatisticsCollection = Backbone.Collection.extend({
|
|||
cuts[counter] : cuts[counter - 1] + " - " + cuts[counter];
|
||||
},
|
||||
|
||||
renderReplicationStatistics: function(object) {
|
||||
$('#repl-numbers table tr:nth-child(1) > td:nth-child(2)').html(object.state.totalEvents);
|
||||
$('#repl-numbers table tr:nth-child(2) > td:nth-child(2)').html(object.state.totalRequests);
|
||||
$('#repl-numbers table tr:nth-child(3) > td:nth-child(2)').html(object.state.totalFailedConnects);
|
||||
|
||||
if (object.state.lastAppliedContinuousTick) {
|
||||
$('#repl-ticks table tr:nth-child(1) > td:nth-child(2)').html(object.state.lastAppliedContinuousTick);
|
||||
}
|
||||
else {
|
||||
$('#repl-ticks table tr:nth-child(1) > td:nth-child(2)').html("no data available").addClass('no-data');
|
||||
}
|
||||
if (object.state.lastProcessedContinuousTick) {
|
||||
$('#repl-ticks table tr:nth-child(2) > td:nth-child(2)').html(object.state.lastProcessedContinuousTick);
|
||||
}
|
||||
else {
|
||||
$('#repl-ticks table tr:nth-child(2) > td:nth-child(2)').html("no data available").addClass('no-data');
|
||||
}
|
||||
if (object.state.lastAvailableContinuousTick) {
|
||||
$('#repl-ticks table tr:nth-child(3) > td:nth-child(2)').html(object.state.lastAvailableContinuousTick);
|
||||
}
|
||||
else {
|
||||
$('#repl-ticks table tr:nth-child(3) > td:nth-child(2)').html("no data available").addClass('no-data');
|
||||
}
|
||||
|
||||
$('#repl-progress table tr:nth-child(1) > td:nth-child(2)').html(object.state.progress.message);
|
||||
$('#repl-progress table tr:nth-child(2) > td:nth-child(2)').html(object.state.progress.failedConnects);
|
||||
},
|
||||
|
||||
getReplicationStatistics: function() {
|
||||
var self = this;
|
||||
|
||||
$.ajax(
|
||||
'/_api/replication/applier-state',
|
||||
{async: true}
|
||||
).done(
|
||||
function (d) {
|
||||
if (d.hasOwnProperty('state')) {
|
||||
var running;
|
||||
if (d.state.running) {
|
||||
running = "active";
|
||||
}
|
||||
else {
|
||||
running = "inactive";
|
||||
}
|
||||
running = '<span class="state">' + running + '</span>';
|
||||
$('#replication-chart .dashboard-sub-bar').html("Replication " + running);
|
||||
|
||||
self.renderReplicationStatistics(d);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getStatistics: function (callback) {
|
||||
var self = this;
|
||||
var url = "/_db/_system/_admin/aardvark/statistics/short";
|
||||
|
@ -2211,6 +2263,8 @@ window.StatisticsCollection = Backbone.Collection.extend({
|
|||
}
|
||||
self.updateCharts();
|
||||
});
|
||||
|
||||
this.getReplicationStatistics();
|
||||
},
|
||||
|
||||
getHistoryStatistics: function (figure) {
|
||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -2063,7 +2063,7 @@ textarea,
|
|||
content: ""; }
|
||||
|
||||
.dropdown-toolbar, .link-dropdown-menu,
|
||||
.user-dropdown-menu, .script-dropdown-menu, .gv-dropdown-menu, .navlogo, .navlist li, div.footer-left, div.footer-left p, div.footer-center, a.headerButton, a.button-gui, div .tile, div .bigtile, div .tile a span.add-Icon, div .bigtile a span.add-Icon, div.centralContent, .contentDiv li, div.dropdownInner ul, .machineClass, .scenarioMachine, .dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container, .dashboard-large-chart, .dashboard-small-chart, .dashboard-sub-bar, .dashboard-sub-bar .dashboard-sub-bar-title, .dashboard-large-chart .dashboard-large-chart-inner .dashboard-interior-chart, .dashboard-small-chart .dashboard-small-chart-inner .dashboard-interior-chart, .dashboard-medium-chart .dashboard-interior-chart, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-subtitle-bar, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-figure, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .percentage, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .absolut, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-chart, .dashboard-legend, .modal-chart-detail, .modal-chart-detail .modal-body, .modal-chart-detail .modal-dashboard-legend, .modal-chart-detail .modal-inner-detail, .dashboard-half-height-legend, .dashboard-title-bar .dashboard-half-title-bar {
|
||||
.user-dropdown-menu, .script-dropdown-menu, .gv-dropdown-menu, .navlogo, .navlist li, div.footer-left, div.footer-left p, div.footer-center, a.headerButton, a.button-gui, div .tile, div .bigtile, div .tile a span.add-Icon, div .bigtile a span.add-Icon, div.centralContent, .contentDiv li, div.dropdownInner ul, .machineClass, .scenarioMachine, .dashboard-full-width-chart .dashboard-full-width-chart-inner, .dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container, .dashboard-full-width-chart, .dashboard-large-chart, .dashboard-small-chart, .dashboard-sub-bar, .dashboard-sub-bar .dashboard-sub-bar-title, .dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart, .dashboard-large-chart .dashboard-large-chart-inner .dashboard-interior-chart, .dashboard-small-chart .dashboard-small-chart-inner .dashboard-interior-chart, .dashboard-medium-chart .dashboard-interior-chart, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-subtitle-bar, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-figure, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .percentage, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .absolut, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-chart, .dashboard-legend, .modal-chart-detail, .modal-chart-detail .modal-body, .modal-chart-detail .modal-dashboard-legend, .modal-chart-detail .modal-inner-detail, .dashboard-half-height-legend, .dashboard-title-bar .dashboard-half-title-bar {
|
||||
float: left; }
|
||||
|
||||
.navmenu, div.footer-right, div.footer-right p, ul.headerButtonList li, div .tile .iconSet span, div .bigtile .iconSet span, .search-field, .headerBar > div.headerButtonBar, .dashboard-sub-bar-menu {
|
||||
|
@ -3112,6 +3112,15 @@ div .bigtile {
|
|||
@media (min-width: 250px) and (max-width: 489px) {
|
||||
.resizecontainer {
|
||||
width: 228px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 225px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 215px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 69.3333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 214px; }
|
||||
.dashboard-large-chart {
|
||||
width: 146px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3288,6 +3297,15 @@ div .bigtile {
|
|||
@media (min-width: 490px) and (max-width: 729px) {
|
||||
.resizecontainer {
|
||||
width: 468px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 465px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 455px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 149.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 454px; }
|
||||
.dashboard-large-chart {
|
||||
width: 306px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3464,6 +3482,15 @@ div .bigtile {
|
|||
@media (min-width: 730px) and (max-width: 969px) {
|
||||
.resizecontainer {
|
||||
width: 708px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 705px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 695px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 229.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 694px; }
|
||||
.dashboard-large-chart {
|
||||
width: 466px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3638,6 +3665,15 @@ div .bigtile {
|
|||
@media (min-width: 970px) and (max-width: 1209px) {
|
||||
.resizecontainer {
|
||||
width: 948px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 945px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 935px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 309.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 934px; }
|
||||
.dashboard-large-chart {
|
||||
width: 626px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3809,6 +3845,15 @@ div .bigtile {
|
|||
@media (min-width: 1210px) and (max-width: 1449px) {
|
||||
.resizecontainer {
|
||||
width: 1188px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1185px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1175px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 389.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1174px; }
|
||||
.dashboard-large-chart {
|
||||
width: 786px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3980,6 +4025,15 @@ div .bigtile {
|
|||
@media (min-width: 1450px) and (max-width: 1689px) {
|
||||
.resizecontainer {
|
||||
width: 1428px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1425px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1415px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 469.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1414px; }
|
||||
.dashboard-large-chart {
|
||||
width: 946px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4151,6 +4205,15 @@ div .bigtile {
|
|||
@media (min-width: 1690px) and (max-width: 1929px) {
|
||||
.resizecontainer {
|
||||
width: 1668px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1665px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1655px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 549.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1654px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1106px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4322,6 +4385,15 @@ div .bigtile {
|
|||
@media (min-width: 1930px) and (max-width: 2169px) {
|
||||
.resizecontainer {
|
||||
width: 1908px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1905px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1895px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 629.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1894px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1266px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4493,6 +4565,15 @@ div .bigtile {
|
|||
@media (min-width: 2170px) and (max-width: 2409px) {
|
||||
.resizecontainer {
|
||||
width: 2148px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2145px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2135px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 709.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2134px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1426px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4664,6 +4745,15 @@ div .bigtile {
|
|||
@media (min-width: 2410px) and (max-width: 2649px) {
|
||||
.resizecontainer {
|
||||
width: 2388px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2385px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2375px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 789.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2374px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1586px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4835,6 +4925,15 @@ div .bigtile {
|
|||
@media (min-width: 2650px) and (max-width: 2889px) {
|
||||
.resizecontainer {
|
||||
width: 2628px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2625px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2615px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 869.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2614px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1746px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -5985,14 +6084,14 @@ div .bigtile {
|
|||
right: 0;
|
||||
text-align: left; }
|
||||
|
||||
.dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner, .dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
border-left: 0 solid #000;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px; }
|
||||
.dashboard-large-chart .dashboard-large-chart-inner:first-child, .dashboard-small-chart .dashboard-small-chart-inner:first-child, .dashboard-medium-chart:first-child, .dashboard-tendency-container:first-child, .dashboard-bar-chart-container:first-child {
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner:first-child, .dashboard-large-chart .dashboard-large-chart-inner:first-child, .dashboard-small-chart .dashboard-small-chart-inner:first-child, .dashboard-medium-chart:first-child, .dashboard-tendency-container:first-child, .dashboard-bar-chart-container:first-child {
|
||||
margin-left: 0; }
|
||||
|
||||
.dashboard-large-chart, .dashboard-small-chart, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
.dashboard-full-width-chart, .dashboard-large-chart, .dashboard-small-chart, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
margin-bottom: 10px;
|
||||
position: relative; }
|
||||
|
||||
|
@ -6012,6 +6111,51 @@ div .bigtile {
|
|||
margin: 0;
|
||||
padding: 0 6px; }
|
||||
|
||||
.dashboard-full-width-chart {
|
||||
border: 1px solid rgba(104, 103, 102, 0.1);
|
||||
border-radius: 3px;
|
||||
margin-right: 12px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
background-color: #fff;
|
||||
border-left: 5px solid #fff;
|
||||
border-right: 5px solid #fff;
|
||||
border-top: 5px solid #fff;
|
||||
padding-bottom: 10px;
|
||||
padding-top: 12px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-subtitle-bar.top {
|
||||
border-bottom: 1px solid #e1e1e1;
|
||||
height: 48px;
|
||||
line-height: 48px;
|
||||
text-align: right; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
border-left: 1px solid #e1e1e1; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner {
|
||||
margin-left: 10px;
|
||||
margin-right: 10px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table {
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
table-layout: fixed;
|
||||
width: 100%; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table .no-data {
|
||||
font-style: italic;
|
||||
font-weight: 100; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table tr {
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.025); }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table td:first-child {
|
||||
width: 100px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table td:last-child {
|
||||
text-align: right; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart:first-child {
|
||||
border-left: 0; }
|
||||
.dashboard-full-width-chart .state {
|
||||
background-color: #fff;
|
||||
border-radius: 5px;
|
||||
color: #000;
|
||||
margin-left: 5px;
|
||||
padding-left: 6px;
|
||||
padding-right: 4px; }
|
||||
|
||||
.dashboard-large-chart {
|
||||
border: 1px solid rgba(104, 103, 102, 0.1);
|
||||
border-radius: 3px;
|
||||
|
@ -6192,6 +6336,15 @@ div .bigtile {
|
|||
@media (min-width: 250px) and (max-width: 489px) {
|
||||
.resizecontainer {
|
||||
width: 228px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 225px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 215px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 69.3333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 214px; }
|
||||
.dashboard-large-chart {
|
||||
width: 146px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -6368,6 +6521,15 @@ div .bigtile {
|
|||
@media (min-width: 490px) and (max-width: 729px) {
|
||||
.resizecontainer {
|
||||
width: 468px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 465px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 455px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 149.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 454px; }
|
||||
.dashboard-large-chart {
|
||||
width: 306px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -6544,6 +6706,15 @@ div .bigtile {
|
|||
@media (min-width: 730px) and (max-width: 969px) {
|
||||
.resizecontainer {
|
||||
width: 708px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 705px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 695px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 229.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 694px; }
|
||||
.dashboard-large-chart {
|
||||
width: 466px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -6718,6 +6889,15 @@ div .bigtile {
|
|||
@media (min-width: 970px) and (max-width: 1209px) {
|
||||
.resizecontainer {
|
||||
width: 948px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 945px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 935px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 309.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 934px; }
|
||||
.dashboard-large-chart {
|
||||
width: 626px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -6889,6 +7069,15 @@ div .bigtile {
|
|||
@media (min-width: 1210px) and (max-width: 1449px) {
|
||||
.resizecontainer {
|
||||
width: 1188px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1185px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1175px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 389.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1174px; }
|
||||
.dashboard-large-chart {
|
||||
width: 786px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -7060,6 +7249,15 @@ div .bigtile {
|
|||
@media (min-width: 1450px) and (max-width: 1689px) {
|
||||
.resizecontainer {
|
||||
width: 1428px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1425px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1415px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 469.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1414px; }
|
||||
.dashboard-large-chart {
|
||||
width: 946px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -7231,6 +7429,15 @@ div .bigtile {
|
|||
@media (min-width: 1690px) and (max-width: 1929px) {
|
||||
.resizecontainer {
|
||||
width: 1668px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1665px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1655px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 549.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1654px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1106px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -7402,6 +7609,15 @@ div .bigtile {
|
|||
@media (min-width: 1930px) and (max-width: 2169px) {
|
||||
.resizecontainer {
|
||||
width: 1908px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1905px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1895px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 629.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1894px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1266px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -7573,6 +7789,15 @@ div .bigtile {
|
|||
@media (min-width: 2170px) and (max-width: 2409px) {
|
||||
.resizecontainer {
|
||||
width: 2148px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2145px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2135px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 709.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2134px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1426px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -7744,6 +7969,15 @@ div .bigtile {
|
|||
@media (min-width: 2410px) and (max-width: 2649px) {
|
||||
.resizecontainer {
|
||||
width: 2388px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2385px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2375px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 789.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2374px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1586px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -7915,6 +8149,15 @@ div .bigtile {
|
|||
@media (min-width: 2650px) and (max-width: 2889px) {
|
||||
.resizecontainer {
|
||||
width: 2628px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2625px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2615px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 869.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2614px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1746px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -9070,10 +9070,14 @@ function explain (data, options, shouldPrint) {
|
|||
throw "ArangoStatement needs initial data";
|
||||
}
|
||||
|
||||
if (options === undefined) {
|
||||
options = data.options;
|
||||
}
|
||||
options = options || { };
|
||||
setColors(options.colors === undefined ? true : options.colors);
|
||||
|
||||
var stmt = db._createStatement(data);
|
||||
|
||||
var result = stmt.explain(options);
|
||||
|
||||
stringBuilder.clearOutput();
|
||||
|
|
|
@ -25800,14 +25800,14 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
|||
var AqlHighlightRules = function() {
|
||||
|
||||
var keywords = (
|
||||
"for|return|filter|sort|limit|let|collect|asc|desc|if|in|into|insert|update|remove|replace|options|with|and|or|not|distinct"
|
||||
"for|return|filter|sort|limit|let|collect|asc|desc|in|into|insert|update|remove|replace|upsert|options|with|and|or|not|distinct|outbound|inbound|any|graph"
|
||||
);
|
||||
|
||||
var builtinFunctions = (
|
||||
"(to_bool|to_number|to_string|to_list|is_null|is_bool|is_number|is_string|is_list|is_document|" +
|
||||
"concat|concat_separator|char_length|lower|upper|substring|left|right|trim|reverse|contains|" +
|
||||
"like|floor|ceil|round|abs|rand|sqrt|length|min|max|average|sum|median|variance_population|" +
|
||||
"variance_sample|first|last|unique|matches|merge|merge_recursive|has|attributes|values|unset|keep|" +
|
||||
"variance_sample|first|last|unique|matches|merge|merge_recursive|has|attributes|values|unset|unset_recursive|keep|" +
|
||||
"near|within|within_rectangle|is_in_polygon|fulltext|paths|traversal|traversal_tree|edges|stddev_sample|stddev_population|" +
|
||||
"slice|nth|position|translate|zip|call|apply|push|append|pop|shift|unshift|remove_value|remove_values|" +
|
||||
"remove_nth|graph_paths|shortest_path|graph_shortest_path|graph_distance_to|graph_traversal|graph_traversal_tree|graph_edges|" +
|
||||
|
@ -25819,7 +25819,7 @@ var AqlHighlightRules = function() {
|
|||
"date_add|date_subtract|date_diff|date_compare|date_format|fail|passthru|sleep|not_null|" +
|
||||
"first_list|first_document|parse_identifier|current_user|current_database|" +
|
||||
"collections|document|union|union_distinct|intersection|flatten|" +
|
||||
"ltrim|rtrim|find_first|find_last|split|substitute|assemble|md5|sha1|random_token|AQL_LAST_ENTRY)"
|
||||
"ltrim|rtrim|find_first|find_last|split|substitute|md5|sha1|random_token|AQL_LAST_ENTRY)"
|
||||
);
|
||||
|
||||
var keywordMapper = this.createKeywordMapper({
|
||||
|
@ -25854,7 +25854,7 @@ var AqlHighlightRules = function() {
|
|||
regex : "[a-zA-Z_][a-zA-Z0-9_]*\\b"
|
||||
}, {
|
||||
token : "keyword.operator",
|
||||
regex : "\\+|\\-|\\/|\\/\\/|%|@>|<@|&&|\\||!|<|>|<=|=>|==|!=|="
|
||||
regex : "\\+|\\-|\\/|\\/\\/|%|@>|<@|&&|\\|\\||!|<|>|<=|=>|==|!=|=|\\[\\*\\]"
|
||||
}, {
|
||||
token : "paren.lparen",
|
||||
regex : "[\\(\\{]"
|
||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -1,3 +1,3 @@
|
|||
<script src="sharedLibs.js?version=1447765025003"></script>
|
||||
<script src="libs.js?version=1447765025003"></script>
|
||||
<script src="app.js?version=1447765025003"></script>
|
||||
<script src="sharedLibs.js?version=1448051164122"></script>
|
||||
<script src="libs.js?version=1448051164122"></script>
|
||||
<script src="app.js?version=1448051164122"></script>
|
||||
|
|
|
@ -513,6 +513,83 @@
|
|||
<div class="dashboard-row">
|
||||
<% mediumChart("pageFaultsChart", "Major Page Faults") %>
|
||||
<% mediumChart("systemUserTimeChart", "Used CPU Time per Second") %>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-headerbar headerBar">
|
||||
<a class="arangoHeader">Replication</a>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-row">
|
||||
<div class="dashboard-full-width-chart" id="replication-chart">
|
||||
<div class="dashboard-full-width-chart-inner">
|
||||
<div id="repl-numbers" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Numbers</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Events</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Requests</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-ticks" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Ticks</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Applied</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Processed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Available</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-progress" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Progress</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Message</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dashboard-sub-bar"">Replication</div>
|
||||
</div>
|
||||
</div></script><script id="databaseView.ejs" type="text/template"><div class="headerBar">
|
||||
<div class="search-field">
|
||||
<input type="text" value="<%=searchString%>" id="databaseSearchInput" class="search-input" placeholder="Search..."/>
|
||||
|
@ -2617,4 +2694,4 @@ var cutByResolution = function (str) {
|
|||
<% }); %>
|
||||
</ul>
|
||||
</div>
|
||||
<% } %></script></head><body><nav class="navbar"><div class="resizecontainer"><div class="navlogo"><a class="logo" href="#"><img class="arangodbLogo" src="img/arangodb_logo_small.png"></a></div><div id="progressPlaceholderIcon"></div><div class="statmenu" id="statisticBar"></div><div class="usermenu" id="userBar" style="float:right"></div><div class="notificationmenu" id="notificationBar" style="float:right"></div><div class="navmenu" id="navigationBar"></div></div></nav><div class="centralRow resizecontainer"><div id="content" class="centralContent"></div></div><div id="modalPlaceholder"></div><div id="progressPlaceholder" style="display:none"></div><footer class="footer"><div class="resizecontainer" id="footerBar"></div></footer><script src="sharedLibs.js?version=1447765025003"></script><script src="libs.js?version=1447765025003"></script><script src="app.js?version=1447765025003"></script></body></html>
|
||||
<% } %></script></head><body><nav class="navbar"><div class="resizecontainer"><div class="navlogo"><a class="logo" href="#"><img class="arangodbLogo" src="img/arangodb_logo_small.png"></a></div><div id="progressPlaceholderIcon"></div><div class="statmenu" id="statisticBar"></div><div class="usermenu" id="userBar" style="float:right"></div><div class="notificationmenu" id="notificationBar" style="float:right"></div><div class="navmenu" id="navigationBar"></div></div></nav><div class="centralRow resizecontainer"><div id="content" class="centralContent"></div></div><div id="modalPlaceholder"></div><div id="progressPlaceholder" style="display:none"></div><footer class="footer"><div class="resizecontainer" id="footerBar"></div></footer><script src="sharedLibs.js?version=1448051164122"></script><script src="libs.js?version=1448051164122"></script><script src="app.js?version=1448051164122"></script></body></html>
|
Binary file not shown.
|
@ -558,6 +558,84 @@
|
|||
<% mediumChart("pageFaultsChart", "Major Page Faults") %>
|
||||
<% mediumChart("systemUserTimeChart", "Used CPU Time per Second") %>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-headerbar headerBar">
|
||||
<a class="arangoHeader">Replication</a>
|
||||
</div>
|
||||
|
||||
<div class="dashboard-row">
|
||||
<div class="dashboard-full-width-chart" id="replication-chart">
|
||||
<div class="dashboard-full-width-chart-inner">
|
||||
<div id="repl-numbers" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Numbers</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Events</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Requests</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-ticks" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Ticks</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Applied</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Processed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Available</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="repl-progress" class="dashboard-interior-chart">
|
||||
<div class="inner">
|
||||
<div class="top dashboard-subtitle-bar">Progress</div>
|
||||
<div class="bottom">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Message</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dashboard-sub-bar"">Replication</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</script>
|
||||
|
||||
<script id="databaseView.ejs" type="text/template">
|
||||
|
@ -2864,9 +2942,9 @@ var cutByResolution = function (str) {
|
|||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="sharedLibs.js?version=1447765025003"></script>
|
||||
<script src="libs.js?version=1447765025003"></script>
|
||||
<script src="app.js?version=1447765025003"></script>
|
||||
<script src="sharedLibs.js?version=1448051164122"></script>
|
||||
<script src="libs.js?version=1448051164122"></script>
|
||||
<script src="app.js?version=1448051164122"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -2073,7 +2073,7 @@ textarea,
|
|||
content: ""; }
|
||||
|
||||
.dropdown-toolbar, .link-dropdown-menu,
|
||||
.user-dropdown-menu, .script-dropdown-menu, .gv-dropdown-menu, .navlogo, .navlist li, div.footer-left, div.footer-left p, div.footer-center, a.headerButton, a.button-gui, div .tile, div .bigtile, div .tile a span.add-Icon, div .bigtile a span.add-Icon, div.centralContent, .contentDiv li, div.dropdownInner ul, .fixedDropdown .notificationItemContent, .innerDropdownInnerUL, .dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container, .dashboard-large-chart, .dashboard-small-chart, .dashboard-sub-bar, .dashboard-sub-bar .dashboard-sub-bar-title, .dashboard-large-chart .dashboard-large-chart-inner .dashboard-interior-chart, .dashboard-small-chart .dashboard-small-chart-inner .dashboard-interior-chart, .dashboard-medium-chart .dashboard-interior-chart, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-subtitle-bar, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-figure, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .percentage, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .absolut, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-chart, .dashboard-legend, .modal-chart-detail, .modal-chart-detail .modal-body, .modal-chart-detail .modal-dashboard-legend, .modal-chart-detail .modal-inner-detail, .dashboard-half-height-legend, .dashboard-title-bar .dashboard-half-title-bar, .dashboardModal, .pagination-line li a {
|
||||
.user-dropdown-menu, .script-dropdown-menu, .gv-dropdown-menu, .navlogo, .navlist li, div.footer-left, div.footer-left p, div.footer-center, a.headerButton, a.button-gui, div .tile, div .bigtile, div .tile a span.add-Icon, div .bigtile a span.add-Icon, div.centralContent, .contentDiv li, div.dropdownInner ul, .fixedDropdown .notificationItemContent, .innerDropdownInnerUL, .dashboard-full-width-chart .dashboard-full-width-chart-inner, .dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container, .dashboard-full-width-chart, .dashboard-large-chart, .dashboard-small-chart, .dashboard-sub-bar, .dashboard-sub-bar .dashboard-sub-bar-title, .dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart, .dashboard-large-chart .dashboard-large-chart-inner .dashboard-interior-chart, .dashboard-small-chart .dashboard-small-chart-inner .dashboard-interior-chart, .dashboard-medium-chart .dashboard-interior-chart, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-subtitle-bar, .dashboard-tendency-container .dashboard-tendency-chart .dashboard-tendency .dashboard-figure, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .percentage, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-title .absolut, .dashboard-bar-chart-container .dashboard-bar-chart .dashboard-bar-chart-chart, .dashboard-legend, .modal-chart-detail, .modal-chart-detail .modal-body, .modal-chart-detail .modal-dashboard-legend, .modal-chart-detail .modal-inner-detail, .dashboard-half-height-legend, .dashboard-title-bar .dashboard-half-title-bar, .dashboardModal, .pagination-line li a {
|
||||
float: left; }
|
||||
|
||||
.navmenu, div.footer-right, div.footer-right p, ul.headerButtonList li, div .tile .iconSet span, div .bigtile .iconSet span, .search-field, .headerBar > div.headerButtonBar, .fixedDropdown button, .fixedDropdown .notificationItem i, .dashboard-sub-bar-menu, .query-button, .arango-tab li, div.gv_colour_list, .docsThirdCol {
|
||||
|
@ -3102,6 +3102,15 @@ div .bigtile {
|
|||
@media (min-width: 250px) and (max-width: 489px) {
|
||||
.resizecontainer {
|
||||
width: 228px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 225px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 215px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 69.3333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 214px; }
|
||||
.dashboard-large-chart {
|
||||
width: 146px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3278,6 +3287,15 @@ div .bigtile {
|
|||
@media (min-width: 490px) and (max-width: 729px) {
|
||||
.resizecontainer {
|
||||
width: 468px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 465px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 455px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 149.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 454px; }
|
||||
.dashboard-large-chart {
|
||||
width: 306px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3454,6 +3472,15 @@ div .bigtile {
|
|||
@media (min-width: 730px) and (max-width: 969px) {
|
||||
.resizecontainer {
|
||||
width: 708px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 705px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 695px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 229.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 694px; }
|
||||
.dashboard-large-chart {
|
||||
width: 466px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3628,6 +3655,15 @@ div .bigtile {
|
|||
@media (min-width: 970px) and (max-width: 1209px) {
|
||||
.resizecontainer {
|
||||
width: 948px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 945px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 935px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 309.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 934px; }
|
||||
.dashboard-large-chart {
|
||||
width: 626px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3799,6 +3835,15 @@ div .bigtile {
|
|||
@media (min-width: 1210px) and (max-width: 1449px) {
|
||||
.resizecontainer {
|
||||
width: 1188px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1185px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1175px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 389.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1174px; }
|
||||
.dashboard-large-chart {
|
||||
width: 786px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -3970,6 +4015,15 @@ div .bigtile {
|
|||
@media (min-width: 1450px) and (max-width: 1689px) {
|
||||
.resizecontainer {
|
||||
width: 1428px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1425px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1415px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 469.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1414px; }
|
||||
.dashboard-large-chart {
|
||||
width: 946px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4141,6 +4195,15 @@ div .bigtile {
|
|||
@media (min-width: 1690px) and (max-width: 1929px) {
|
||||
.resizecontainer {
|
||||
width: 1668px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1665px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1655px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 549.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1654px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1106px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4312,6 +4375,15 @@ div .bigtile {
|
|||
@media (min-width: 1930px) and (max-width: 2169px) {
|
||||
.resizecontainer {
|
||||
width: 1908px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 1905px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 1895px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 629.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 1894px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1266px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4483,6 +4555,15 @@ div .bigtile {
|
|||
@media (min-width: 2170px) and (max-width: 2409px) {
|
||||
.resizecontainer {
|
||||
width: 2148px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2145px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2135px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 709.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2134px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1426px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4654,6 +4735,15 @@ div .bigtile {
|
|||
@media (min-width: 2410px) and (max-width: 2649px) {
|
||||
.resizecontainer {
|
||||
width: 2388px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2385px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2375px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 789.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2374px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1586px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -4825,6 +4915,15 @@ div .bigtile {
|
|||
@media (min-width: 2650px) and (max-width: 2889px) {
|
||||
.resizecontainer {
|
||||
width: 2628px; }
|
||||
.dashboard-full-width-chart {
|
||||
width: 2625px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
width: 2615px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
float: left;
|
||||
width: 869.333333333px; }
|
||||
.dashboard-full-width-chart .dashboard-sub-bar {
|
||||
width: 2614px; }
|
||||
.dashboard-large-chart {
|
||||
width: 1746px; }
|
||||
.dashboard-large-chart .dashboard-sub-bar {
|
||||
|
@ -5848,14 +5947,14 @@ div.headerBar {
|
|||
text-overflow: ellipsis;
|
||||
white-space: nowrap; }
|
||||
|
||||
.dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner, .dashboard-large-chart .dashboard-large-chart-inner, .dashboard-small-chart .dashboard-small-chart-inner, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
border-left: 0 solid #000;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px; }
|
||||
.dashboard-large-chart .dashboard-large-chart-inner:first-child, .dashboard-small-chart .dashboard-small-chart-inner:first-child, .dashboard-medium-chart:first-child, .dashboard-tendency-container:first-child, .dashboard-bar-chart-container:first-child {
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner:first-child, .dashboard-large-chart .dashboard-large-chart-inner:first-child, .dashboard-small-chart .dashboard-small-chart-inner:first-child, .dashboard-medium-chart:first-child, .dashboard-tendency-container:first-child, .dashboard-bar-chart-container:first-child {
|
||||
margin-left: 0; }
|
||||
|
||||
.dashboard-large-chart, .dashboard-small-chart, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
.dashboard-full-width-chart, .dashboard-large-chart, .dashboard-small-chart, .dashboard-medium-chart, .dashboard-tendency-container, .dashboard-bar-chart-container {
|
||||
margin-bottom: 10px;
|
||||
position: relative; }
|
||||
|
||||
|
@ -5875,6 +5974,51 @@ div.headerBar {
|
|||
margin: 0;
|
||||
padding: 0 6px; }
|
||||
|
||||
.dashboard-full-width-chart {
|
||||
border: 1px solid rgba(104, 103, 102, 0.1);
|
||||
border-radius: 3px;
|
||||
margin-right: 12px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner {
|
||||
background-color: #fff;
|
||||
border-left: 5px solid #fff;
|
||||
border-right: 5px solid #fff;
|
||||
border-top: 5px solid #fff;
|
||||
padding-bottom: 10px;
|
||||
padding-top: 12px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-subtitle-bar.top {
|
||||
border-bottom: 1px solid #e1e1e1;
|
||||
height: 48px;
|
||||
line-height: 48px;
|
||||
text-align: right; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart {
|
||||
border-left: 1px solid #e1e1e1; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner {
|
||||
margin-left: 10px;
|
||||
margin-right: 10px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table {
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
table-layout: fixed;
|
||||
width: 100%; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table .no-data {
|
||||
font-style: italic;
|
||||
font-weight: 100; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table tr {
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.025); }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table td:first-child {
|
||||
width: 100px; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart .inner table td:last-child {
|
||||
text-align: right; }
|
||||
.dashboard-full-width-chart .dashboard-full-width-chart-inner .dashboard-interior-chart:first-child {
|
||||
border-left: 0; }
|
||||
.dashboard-full-width-chart .state {
|
||||
background-color: #fff;
|
||||
border-radius: 5px;
|
||||
color: #000;
|
||||
margin-left: 5px;
|
||||
padding-left: 6px;
|
||||
padding-right: 4px; }
|
||||
|
||||
.dashboard-large-chart {
|
||||
border: 1px solid rgba(104, 103, 102, 0.1);
|
||||
border-radius: 3px;
|
||||
|
|
Binary file not shown.
|
@ -678,7 +678,7 @@ function processQuery (query, explain) {
|
|||
}
|
||||
|
||||
/* the exposed function */
|
||||
function explain (data, options, shouldPrint, bindVars) {
|
||||
function explain (data, options, shouldPrint) {
|
||||
'use strict';
|
||||
if (typeof data === "string") {
|
||||
data = { query: data };
|
||||
|
@ -695,12 +695,6 @@ function explain (data, options, shouldPrint, bindVars) {
|
|||
|
||||
var stmt = db._createStatement(data);
|
||||
|
||||
if (typeof bindVars === 'object') {
|
||||
Object.keys(bindVars).forEach(function(key) {
|
||||
stmt.bind(key, bindVars[key]);
|
||||
});
|
||||
}
|
||||
|
||||
var result = stmt.explain(options);
|
||||
|
||||
stringBuilder.clearOutput();
|
||||
|
|
|
@ -226,6 +226,9 @@
|
|||
},
|
||||
|
||||
queryManagement: function () {
|
||||
if (!this.checkUser()) {
|
||||
return;
|
||||
}
|
||||
if (!this.queryManagementView) {
|
||||
this.queryManagementView = new window.queryManagementView({
|
||||
collection: undefined
|
||||
|
|
|
@ -199,10 +199,6 @@
|
|||
<td>Message</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Time</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Failed</td>
|
||||
<td></td>
|
||||
|
|
|
@ -420,13 +420,27 @@
|
|||
$('#repl-numbers table tr:nth-child(2) > td:nth-child(2)').html(object.state.totalRequests);
|
||||
$('#repl-numbers table tr:nth-child(3) > td:nth-child(2)').html(object.state.totalFailedConnects);
|
||||
|
||||
$('#repl-ticks table tr:nth-child(1) > td:nth-child(2)').html(object.state.lastAppliedContinuousTick);
|
||||
$('#repl-ticks table tr:nth-child(2) > td:nth-child(2)').html(object.state.lastProcessedContinuousTick);
|
||||
$('#repl-ticks table tr:nth-child(3) > td:nth-child(2)').html(object.state.lastAvailableContinuousTick);
|
||||
if (object.state.lastAppliedContinuousTick) {
|
||||
$('#repl-ticks table tr:nth-child(1) > td:nth-child(2)').html(object.state.lastAppliedContinuousTick);
|
||||
}
|
||||
else {
|
||||
$('#repl-ticks table tr:nth-child(1) > td:nth-child(2)').html("no data available").addClass('no-data');
|
||||
}
|
||||
if (object.state.lastProcessedContinuousTick) {
|
||||
$('#repl-ticks table tr:nth-child(2) > td:nth-child(2)').html(object.state.lastProcessedContinuousTick);
|
||||
}
|
||||
else {
|
||||
$('#repl-ticks table tr:nth-child(2) > td:nth-child(2)').html("no data available").addClass('no-data');
|
||||
}
|
||||
if (object.state.lastAvailableContinuousTick) {
|
||||
$('#repl-ticks table tr:nth-child(3) > td:nth-child(2)').html(object.state.lastAvailableContinuousTick);
|
||||
}
|
||||
else {
|
||||
$('#repl-ticks table tr:nth-child(3) > td:nth-child(2)').html("no data available").addClass('no-data');
|
||||
}
|
||||
|
||||
$('#repl-progress table tr:nth-child(1) > td:nth-child(2)').html(object.state.progress.message);
|
||||
$('#repl-progress table tr:nth-child(2) > td:nth-child(2)').html(object.state.progress.time);
|
||||
$('#repl-progress table tr:nth-child(3) > td:nth-child(2)').html(object.state.progress.failedConnects);
|
||||
$('#repl-progress table tr:nth-child(2) > td:nth-child(2)').html(object.state.progress.failedConnects);
|
||||
},
|
||||
|
||||
getReplicationStatistics: function() {
|
||||
|
@ -437,14 +451,13 @@
|
|||
{async: true}
|
||||
).done(
|
||||
function (d) {
|
||||
console.log(d);
|
||||
if (d.hasOwnProperty('state')) {
|
||||
var running;
|
||||
if (d.state.running) {
|
||||
running = "Enabled";
|
||||
running = "active";
|
||||
}
|
||||
else {
|
||||
running = "Disabled";
|
||||
running = "inactive";
|
||||
}
|
||||
running = '<span class="state">' + running + '</span>';
|
||||
$('#replication-chart .dashboard-sub-bar').html("Replication " + running);
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
},
|
||||
|
||||
performAction: function() {
|
||||
//this.action();
|
||||
this.action();
|
||||
window.progressView.hide();
|
||||
},
|
||||
|
||||
|
@ -43,11 +43,23 @@
|
|||
}, self.lastDelay);
|
||||
},
|
||||
|
||||
show: function(msg, action, button) {
|
||||
show: function(msg, callback, buttonText) {
|
||||
$(this.el).html(this.template.render({}));
|
||||
$(".progress-text").text(msg);
|
||||
$(".progress-action").html('<button class="button-danger">Cancel</button>');
|
||||
this.action = this.hide();
|
||||
|
||||
if (!buttonText) {
|
||||
$(".progress-action").html('<button class="button-danger">Cancel</button>');
|
||||
}
|
||||
else {
|
||||
$(".progress-action").html('<button class="button-danger">' + buttonText + '</button>');
|
||||
}
|
||||
|
||||
if (!callback) {
|
||||
this.action = this.hide();
|
||||
}
|
||||
else {
|
||||
this.action = callback;
|
||||
}
|
||||
//$(".progress-action").html(button);
|
||||
//this.action = action;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*jshint browser: true */
|
||||
/*jshint unused: false */
|
||||
/*global Backbone, EJS, $, setTimeout, localStorage, ace, Storage, window, _, console */
|
||||
/*global Backbone, EJS, $, setTimeout, localStorage, ace, Storage, window, _, console, btoa*/
|
||||
/*global _, arangoHelper, templateEngine, jQuery, Joi, d3*/
|
||||
|
||||
(function () {
|
||||
|
@ -329,7 +329,7 @@
|
|||
},
|
||||
|
||||
getCachedQuery: function() {
|
||||
if(typeof(Storage) !== "undefined") {
|
||||
if (Storage !== "undefined") {
|
||||
var cache = localStorage.getItem("cachedQuery");
|
||||
if (cache !== undefined) {
|
||||
var query = JSON.parse(cache);
|
||||
|
@ -339,7 +339,7 @@
|
|||
},
|
||||
|
||||
setCachedQuery: function(query, vars) {
|
||||
if (typeof(Storage) !== "undefined") {
|
||||
if (Storage !== "undefined") {
|
||||
var myObject = {
|
||||
query: query,
|
||||
parameter: vars
|
||||
|
@ -392,7 +392,7 @@
|
|||
|
||||
exportCustomQueries: function () {
|
||||
var name, toExport = {}, exportArray = [];
|
||||
_.each(this.customQueries, function(value, key) {
|
||||
_.each(this.customQueries, function(value) {
|
||||
exportArray.push({name: value.name, value: value.value, parameter: value.parameter});
|
||||
});
|
||||
toExport = {
|
||||
|
@ -577,7 +577,7 @@
|
|||
success: function (data) {
|
||||
self.queries = data;
|
||||
},
|
||||
error: function (data) {
|
||||
error: function () {
|
||||
arangoHelper.arangoNotification("Query", "Error while loading system templates");
|
||||
}
|
||||
});
|
||||
|
@ -856,10 +856,6 @@
|
|||
},
|
||||
*/
|
||||
|
||||
resize: function() {
|
||||
// this.drawTree();
|
||||
},
|
||||
|
||||
/*
|
||||
showExplainPlan: function(plan) {
|
||||
$("svg#explainOutput").html();
|
||||
|
@ -976,6 +972,107 @@
|
|||
}
|
||||
},
|
||||
|
||||
resize: function() {
|
||||
// this.drawTree();
|
||||
},
|
||||
|
||||
checkQueryTimer: undefined,
|
||||
|
||||
queryCallbackFunction: function(queryID, callback) {
|
||||
|
||||
var self = this;
|
||||
var outputEditor = ace.edit("queryOutput");
|
||||
|
||||
var cancelRunningQuery = function() {
|
||||
|
||||
$.ajax({
|
||||
url: '/_api/job/'+ encodeURIComponent(queryID) + "/cancel",
|
||||
type: 'PUT',
|
||||
success: function() {
|
||||
window.clearTimeout(self.checkQueryTimer);
|
||||
arangoHelper.arangoNotification("Query", "Query canceled.");
|
||||
window.progressView.hide();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
window.progressView.show(
|
||||
"Query is operating...",
|
||||
cancelRunningQuery,
|
||||
"Cancel Query"
|
||||
);
|
||||
|
||||
$('.queryExecutionTime').text('');
|
||||
self.timer.start();
|
||||
this.execPending = false;
|
||||
|
||||
var time = "Execution time: " + self.timer.getTimeAndReset()/1000 + " s";
|
||||
$('.queryExecutionTime').text(time);
|
||||
|
||||
var warningsFunc = function(data) {
|
||||
var warnings = "";
|
||||
if (data.extra && data.extra.warnings && data.extra.warnings.length > 0) {
|
||||
warnings += "Warnings:" + "\r\n\r\n";
|
||||
data.extra.warnings.forEach(function(w) {
|
||||
warnings += "[" + w.code + "], '" + w.message + "'\r\n";
|
||||
});
|
||||
}
|
||||
if (warnings !== "") {
|
||||
warnings += "\r\n" + "Result:" + "\r\n\r\n";
|
||||
}
|
||||
outputEditor.setValue(warnings + JSON.stringify(data.result, undefined, 2));
|
||||
};
|
||||
|
||||
var fetchQueryResult = function(data) {
|
||||
warningsFunc(data);
|
||||
self.switchTab("result-switch");
|
||||
window.progressView.hide();
|
||||
self.deselect(outputEditor);
|
||||
$('#downloadQueryResult').show();
|
||||
|
||||
if (typeof callback === "function") {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
|
||||
//check if async query is finished
|
||||
var checkQueryStatus = function() {
|
||||
$.ajax({
|
||||
type: "PUT",
|
||||
url: "/_api/job/" + encodeURIComponent(queryID),
|
||||
contentType: "application/json",
|
||||
processData: false,
|
||||
success: function (data, textStatus, xhr) {
|
||||
|
||||
//query finished, now fetch results
|
||||
if (xhr.status === 201) {
|
||||
fetchQueryResult(data);
|
||||
}
|
||||
//query not ready yet, retry
|
||||
else if (xhr.status === 204) {
|
||||
self.checkQueryTimer = window.setTimeout(function() {
|
||||
checkQueryStatus();
|
||||
}, 500);
|
||||
}
|
||||
},
|
||||
error: function (resp) {
|
||||
try {
|
||||
var error = JSON.parse(resp.responseText);
|
||||
if (error.errorMessage) {
|
||||
arangoHelper.arangoError("Query", error.errorMessage);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
arangoHelper.arangoError("Query", "Something went wrong.");
|
||||
}
|
||||
|
||||
window.progressView.hide();
|
||||
}
|
||||
});
|
||||
};
|
||||
checkQueryStatus();
|
||||
},
|
||||
|
||||
fillResult: function(callback) {
|
||||
var self = this;
|
||||
var outputEditor = ace.edit("queryOutput");
|
||||
|
@ -984,44 +1081,21 @@
|
|||
|
||||
var queryData = this.readQueryData();
|
||||
if (queryData) {
|
||||
|
||||
window.progressView.show(
|
||||
"Query is operating..."
|
||||
);
|
||||
|
||||
$('.queryExecutionTime').text('');
|
||||
self.timer.start();
|
||||
|
||||
this.execPending = false;
|
||||
console.log(2);
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/_api/cursor",
|
||||
headers: {
|
||||
'x-arango-async': 'store'
|
||||
},
|
||||
data: queryData,
|
||||
contentType: "application/json",
|
||||
processData: false,
|
||||
success: function (data) {
|
||||
success: function (data, textStatus, xhr) {
|
||||
if (xhr.getResponseHeader('x-arango-async-id')) {
|
||||
self.queryCallbackFunction(xhr.getResponseHeader('x-arango-async-id'), callback);
|
||||
}
|
||||
|
||||
var time = "Execution time: " + self.timer.getTimeAndReset()/1000 + " s";
|
||||
$('.queryExecutionTime').text(time);
|
||||
|
||||
var warnings = "";
|
||||
if (data.extra && data.extra.warnings && data.extra.warnings.length > 0) {
|
||||
warnings += "Warnings:" + "\r\n\r\n";
|
||||
data.extra.warnings.forEach(function(w) {
|
||||
warnings += "[" + w.code + "], '" + w.message + "'\r\n";
|
||||
});
|
||||
}
|
||||
if (warnings !== "") {
|
||||
warnings += "\r\n" + "Result:" + "\r\n\r\n";
|
||||
}
|
||||
outputEditor.setValue(warnings + JSON.stringify(data.result, undefined, 2));
|
||||
self.switchTab("result-switch");
|
||||
window.progressView.hide();
|
||||
self.deselect(outputEditor);
|
||||
$('#downloadQueryResult').show();
|
||||
if (typeof callback === "function") {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
error: function (data) {
|
||||
self.switchTab("result-switch");
|
||||
|
|
|
@ -84,17 +84,27 @@
|
|||
|
||||
|
||||
table {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
|
||||
td {
|
||||
white-space: nowrap;
|
||||
.no-data {
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
tr {
|
||||
border-bottom: 1px solid rgba(0, 0, 0, .025);
|
||||
}
|
||||
|
||||
td:first-child {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
td:last-child {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,8 +121,8 @@
|
|||
border-radius: 5px;
|
||||
color: $c-black;
|
||||
margin-left: 5px;
|
||||
padding-left: 3px;
|
||||
padding-right: 5px;
|
||||
padding-left: 6px;
|
||||
padding-right: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@
|
|||
.dashboard-interior-chart {
|
||||
float: left;
|
||||
$int-height: (($dashboard-height - 29px) / 2) - $tendency-height-corrector;
|
||||
height: $int-height;
|
||||
//height: $int-height + 10px;
|
||||
width: (($int-width - 11px) / 3) - 2px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -677,7 +677,7 @@ function processQuery (query, explain) {
|
|||
}
|
||||
|
||||
/* the exposed function */
|
||||
function explain (data, options, shouldPrint, bindVars) {
|
||||
function explain (data, options, shouldPrint) {
|
||||
'use strict';
|
||||
if (typeof data === "string") {
|
||||
data = { query: data };
|
||||
|
@ -694,12 +694,6 @@ function explain (data, options, shouldPrint, bindVars) {
|
|||
|
||||
var stmt = db._createStatement(data);
|
||||
|
||||
if (typeof bindVars === 'object') {
|
||||
Object.keys(bindVars).forEach(function(key) {
|
||||
stmt.bind(key, bindVars[key]);
|
||||
});
|
||||
}
|
||||
|
||||
var result = stmt.explain(options);
|
||||
|
||||
stringBuilder.clearOutput();
|
||||
|
|
|
@ -54,6 +54,110 @@ function optimizerIndexesTestSuite () {
|
|||
db._drop("UnitTestsCollection");
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test index usage
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testUseIndexMultipleFilters1 : function () {
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "two" });
|
||||
c.insert({ value: "two" });
|
||||
var query = "FOR i IN " + c.name() + " FILTER i.value IN ['one', 'two'] FILTER i.value == 'one' RETURN i.value";
|
||||
|
||||
var plan = AQL_EXPLAIN(query).plan;
|
||||
var nodeTypes = plan.nodes.map(function(node) {
|
||||
return node.type;
|
||||
});
|
||||
|
||||
assertEqual("SingletonNode", nodeTypes[0], query);
|
||||
assertNotEqual(-1, nodeTypes.indexOf("IndexNode"), query);
|
||||
|
||||
var results = AQL_EXECUTE(query);
|
||||
assertEqual([ 'one', 'one' ], results.json, query);
|
||||
assertEqual(0, results.stats.scannedFull);
|
||||
assertTrue(results.stats.scannedIndex > 0);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test index usage
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testUseIndexMultipleFilters2 : function () {
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "two" });
|
||||
c.insert({ value: "two" });
|
||||
var query = "FOR i IN " + c.name() + " FILTER i.value IN ['one', 'two'] FILTER i.value == 'three' RETURN i.value";
|
||||
|
||||
var plan = AQL_EXPLAIN(query).plan;
|
||||
var nodeTypes = plan.nodes.map(function(node) {
|
||||
return node.type;
|
||||
});
|
||||
|
||||
assertEqual("SingletonNode", nodeTypes[0], query);
|
||||
assertEqual(-1, nodeTypes.indexOf("IndexNode"), query);
|
||||
assertNotEqual(-1, nodeTypes.indexOf("NoResultsNode"), query);
|
||||
|
||||
var results = AQL_EXECUTE(query);
|
||||
assertEqual([ ], results.json, query);
|
||||
assertEqual(0, results.stats.scannedFull);
|
||||
assertEqual(0, results.stats.scannedIndex);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test index usage
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testUseIndexMultipleFilters3 : function () {
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "two" });
|
||||
c.insert({ value: "two" });
|
||||
var query = "FOR i IN " + c.name() + " FILTER i.value IN ['one', 'two'] LIMIT 0, 4 FILTER i.value == 'one' RETURN i.value";
|
||||
|
||||
var plan = AQL_EXPLAIN(query).plan;
|
||||
var nodeTypes = plan.nodes.map(function(node) {
|
||||
return node.type;
|
||||
});
|
||||
|
||||
assertEqual("SingletonNode", nodeTypes[0], query);
|
||||
assertNotEqual(-1, nodeTypes.indexOf("IndexNode"), query);
|
||||
assertNotEqual(-1, nodeTypes.indexOf("LimitNode"), query);
|
||||
|
||||
var results = AQL_EXECUTE(query);
|
||||
assertEqual([ 'one', 'one' ], results.json, query);
|
||||
assertEqual(0, results.stats.scannedFull);
|
||||
assertTrue(results.stats.scannedIndex > 0);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test index usage
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testUseIndexMultipleFilters4 : function () {
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "one" });
|
||||
c.insert({ value: "two" });
|
||||
c.insert({ value: "two" });
|
||||
var query = "FOR i IN " + c.name() + " FILTER i.value IN ['one', 'two'] LIMIT 0, 4 FILTER i.value == 'three' RETURN i.value";
|
||||
|
||||
var plan = AQL_EXPLAIN(query).plan;
|
||||
var nodeTypes = plan.nodes.map(function(node) {
|
||||
return node.type;
|
||||
});
|
||||
|
||||
assertEqual("SingletonNode", nodeTypes[0], query);
|
||||
assertEqual(-1, nodeTypes.indexOf("IndexNode"), query);
|
||||
assertNotEqual(-1, nodeTypes.indexOf("NoResultsNode"), query);
|
||||
assertNotEqual(-1, nodeTypes.indexOf("LimitNode"), query);
|
||||
|
||||
var results = AQL_EXECUTE(query);
|
||||
assertEqual([ ], results.json, query);
|
||||
assertEqual(0, results.stats.scannedFull);
|
||||
assertEqual(0, results.stats.scannedIndex);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test index usage
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -231,7 +231,7 @@ HttpResponse::HttpResponseCode HttpResponse::responseCode (int code) {
|
|||
|
||||
case TRI_ERROR_REQUEST_CANCELED:
|
||||
case TRI_ERROR_QUERY_KILLED:
|
||||
return REQUEST_TIMEOUT;
|
||||
return GONE;
|
||||
|
||||
case TRI_ERROR_ARANGO_CONFLICT:
|
||||
case TRI_ERROR_ARANGO_UNIQUE_CONSTRAINT_VIOLATED:
|
||||
|
|
Loading…
Reference in New Issue