1
0
Fork 0

Merge branch 'devel' of https://github.com/arangodb/arangodb into vpack

This commit is contained in:
Jan Steemann 2015-11-23 12:06:29 +01:00
commit b08e1a76bc
59 changed files with 1505 additions and 274 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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:

View File

@ -28,6 +28,7 @@
#define VELOCYPACK_ITERATOR_H 1
#include <iosfwd>
#include <functional>
#include "velocypack/velocypack-common.h"
#include "velocypack/Exception.h"

View File

@ -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();
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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");

View File

@ -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);
}
}

View File

@ -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 != ':') {

View File

@ -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

View File

@ -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
--------------------

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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);

View File

@ -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) { %>

View File

@ -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">

View File

@ -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) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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 {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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();

View File

@ -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 : "[\\(\\{]"

File diff suppressed because one or more lines are too long

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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;

View File

@ -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();

View File

@ -226,6 +226,9 @@
},
queryManagement: function () {
if (!this.checkUser()) {
return;
}
if (!this.queryManagementView) {
this.queryManagementView = new window.queryManagementView({
collection: undefined

View File

@ -199,10 +199,6 @@
<td>Message</td>
<td></td>
</tr>
<tr>
<td>Time</td>
<td></td>
</tr>
<tr>
<td>Failed</td>
<td></td>

View File

@ -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);

View File

@ -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;

View File

@ -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");

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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
////////////////////////////////////////////////////////////////////////////////

View File

@ -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: