1
0
Fork 0

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

This commit is contained in:
Michael Hackstein 2015-06-16 10:46:37 +02:00
commit df75ae48f9
12 changed files with 165 additions and 86 deletions

View File

@ -144,6 +144,13 @@ FOR u IN users
SORT u.lastName, u.firstName, u.id DESC SORT u.lastName, u.firstName, u.id DESC
RETURN u RETURN u
``` ```
Note that constant *SORT* expressions can be used to indicate that no particular
sort order is desired. Constant *SORT* expressions will be optimized away by the AQL
optimizer during optimization, but specifying them explicitly may enable further
optimizations if the optimizer does not need to take into account any particular
sort order.
!SUBSECTION LIMIT !SUBSECTION LIMIT
The *LIMIT* statement allows slicing the result array using an The *LIMIT* statement allows slicing the result array using an
@ -420,7 +427,14 @@ added in front of the *COLLECT*. This is because the *hash* variant of *COLLECT*
sorted input. Instead, a *SORT* statement will be added after the *COLLECT* to sort its output. sorted input. Instead, a *SORT* statement will be added after the *COLLECT* to sort its output.
This *SORT* statement may be optimized away again in later stages. This *SORT* statement may be optimized away again in later stages.
If the sort order of the *COLLECT* is irrelevant to the user, adding the extra instruction *SORT null* If the sort order of the *COLLECT* is irrelevant to the user, adding the extra instruction *SORT null*
after the *COLLECT* will allow the optimizer to remove the sorts altogether. after the *COLLECT* will allow the optimizer to remove the sorts altogether:
```
FOR u IN users
COLLECT age = u.age
SORT null /* note: will be optimized away */
RETURN age
```
Which *COLLECT* variant is used by the optimizer depends on the optimizer's cost estimations. The Which *COLLECT* variant is used by the optimizer depends on the optimizer's cost estimations. The
created plans with the different *COLLECT* variants will be shipped through the regular optimization created plans with the different *COLLECT* variants will be shipped through the regular optimization

View File

@ -40,6 +40,10 @@
using namespace triagens::aql; using namespace triagens::aql;
using Json = triagens::basics::Json; using Json = triagens::basics::Json;
// -----------------------------------------------------------------------------
// --SECTION-- private functions
// -----------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief register warning /// @brief register warning
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -204,6 +208,10 @@ static void AppendAsString (triagens::basics::StringBuffer& buffer,
} }
} }
// -----------------------------------------------------------------------------
// --SECTION-- AQL function bindings
// -----------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief function IS_NULL /// @brief function IS_NULL
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -211,7 +219,7 @@ static void AppendAsString (triagens::basics::StringBuffer& buffer,
AqlValue Functions::IsNull (triagens::aql::Query*, AqlValue Functions::IsNull (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false)); Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isNull())); return AqlValue(new Json(j.isNull()));
} }
@ -223,7 +231,7 @@ AqlValue Functions::IsNull (triagens::aql::Query*,
AqlValue Functions::IsBool (triagens::aql::Query*, AqlValue Functions::IsBool (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false)); Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isBoolean())); return AqlValue(new Json(j.isBoolean()));
} }
@ -235,7 +243,7 @@ AqlValue Functions::IsBool (triagens::aql::Query*,
AqlValue Functions::IsNumber (triagens::aql::Query*, AqlValue Functions::IsNumber (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false)); Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isNumber())); return AqlValue(new Json(j.isNumber()));
} }
@ -247,7 +255,7 @@ AqlValue Functions::IsNumber (triagens::aql::Query*,
AqlValue Functions::IsString (triagens::aql::Query*, AqlValue Functions::IsString (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false)); Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isString())); return AqlValue(new Json(j.isString()));
} }
@ -259,7 +267,7 @@ AqlValue Functions::IsString (triagens::aql::Query*,
AqlValue Functions::IsArray (triagens::aql::Query*, AqlValue Functions::IsArray (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false)); Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isArray())); return AqlValue(new Json(j.isArray()));
} }
@ -271,7 +279,7 @@ AqlValue Functions::IsArray (triagens::aql::Query*,
AqlValue Functions::IsObject (triagens::aql::Query*, AqlValue Functions::IsObject (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false)); Json j(parameters.extractArrayMember(trx, collection, 0, false));
return AqlValue(new Json(j.isObject())); return AqlValue(new Json(j.isObject()));
} }
@ -283,7 +291,7 @@ AqlValue Functions::IsObject (triagens::aql::Query*,
AqlValue Functions::Length (triagens::aql::Query*, AqlValue Functions::Length (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, false)); Json j(parameters.extractArrayMember(trx, collection, 0, false));
TRI_json_t const* json = j.json(); TRI_json_t const* json = j.json();
@ -347,7 +355,7 @@ AqlValue Functions::Length (triagens::aql::Query*,
AqlValue Functions::Concat (triagens::aql::Query*, AqlValue Functions::Concat (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE, 24); triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE, 24);
size_t const n = parameters.arraySize(); size_t const n = parameters.arraySize();
@ -398,7 +406,7 @@ AqlValue Functions::Concat (triagens::aql::Query*,
AqlValue Functions::Passthru (triagens::aql::Query*, AqlValue Functions::Passthru (triagens::aql::Query*,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json j(parameters.extractArrayMember(trx, collection, 0, true)); Json j(parameters.extractArrayMember(trx, collection, 0, true));
auto jr = new Json(TRI_UNKNOWN_MEM_ZONE, j.json()); auto jr = new Json(TRI_UNKNOWN_MEM_ZONE, j.json());
@ -413,7 +421,7 @@ AqlValue Functions::Passthru (triagens::aql::Query*,
AqlValue Functions::Unset (triagens::aql::Query* query, AqlValue Functions::Unset (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isObject()) { if (! value.isObject()) {
@ -471,7 +479,7 @@ AqlValue Functions::Unset (triagens::aql::Query* query,
AqlValue Functions::Keep (triagens::aql::Query* query, AqlValue Functions::Keep (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isObject()) { if (! value.isObject()) {
@ -521,7 +529,7 @@ AqlValue Functions::Keep (triagens::aql::Query* query,
AqlValue Functions::Merge (triagens::aql::Query* query, AqlValue Functions::Merge (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
size_t const n = parameters.arraySize(); size_t const n = parameters.arraySize();
if (n == 0) { if (n == 0) {
@ -569,7 +577,7 @@ AqlValue Functions::Merge (triagens::aql::Query* query,
AqlValue Functions::Has (triagens::aql::Query* query, AqlValue Functions::Has (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
size_t const n = parameters.arraySize(); size_t const n = parameters.arraySize();
if (n < 2) { if (n < 2) {
@ -609,7 +617,7 @@ AqlValue Functions::Has (triagens::aql::Query* query,
AqlValue Functions::Attributes (triagens::aql::Query* query, AqlValue Functions::Attributes (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
size_t const n = parameters.arraySize(); size_t const n = parameters.arraySize();
if (n < 1) { if (n < 1) {
@ -686,7 +694,7 @@ AqlValue Functions::Attributes (triagens::aql::Query* query,
AqlValue Functions::Values (triagens::aql::Query* query, AqlValue Functions::Values (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
size_t const n = parameters.arraySize(); size_t const n = parameters.arraySize();
if (n < 1) { if (n < 1) {
@ -745,7 +753,7 @@ AqlValue Functions::Values (triagens::aql::Query* query,
AqlValue Functions::Min (triagens::aql::Query* query, AqlValue Functions::Min (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) { if (! value.isArray()) {
@ -791,7 +799,7 @@ AqlValue Functions::Min (triagens::aql::Query* query,
AqlValue Functions::Max (triagens::aql::Query* query, AqlValue Functions::Max (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) { if (! value.isArray()) {
@ -837,7 +845,7 @@ AqlValue Functions::Max (triagens::aql::Query* query,
AqlValue Functions::Sum (triagens::aql::Query* query, AqlValue Functions::Sum (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) { if (! value.isArray()) {
@ -884,7 +892,7 @@ AqlValue Functions::Sum (triagens::aql::Query* query,
AqlValue Functions::Average (triagens::aql::Query* query, AqlValue Functions::Average (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
if (! value.isArray()) { if (! value.isArray()) {
@ -934,7 +942,7 @@ AqlValue Functions::Average (triagens::aql::Query* query,
AqlValue Functions::Md5 (triagens::aql::Query* query, AqlValue Functions::Md5 (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE); triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE);
@ -963,7 +971,7 @@ AqlValue Functions::Md5 (triagens::aql::Query* query,
AqlValue Functions::Sha1 (triagens::aql::Query* query, AqlValue Functions::Sha1 (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
Json value(parameters.extractArrayMember(trx, collection, 0, false)); Json value(parameters.extractArrayMember(trx, collection, 0, false));
triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE); triagens::basics::StringBuffer buffer(TRI_UNKNOWN_MEM_ZONE);
@ -992,7 +1000,7 @@ AqlValue Functions::Sha1 (triagens::aql::Query* query,
AqlValue Functions::Unique (triagens::aql::Query* query, AqlValue Functions::Unique (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
if (parameters.arraySize() != 1) { if (parameters.arraySize() != 1) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNIQUE"); THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNIQUE");
} }
@ -1048,7 +1056,7 @@ AqlValue Functions::Unique (triagens::aql::Query* query,
AqlValue Functions::Union (triagens::aql::Query* query, AqlValue Functions::Union (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
size_t const n = parameters.arraySize(); size_t const n = parameters.arraySize();
if (parameters.arraySize() < 2) { if (parameters.arraySize() < 2) {
@ -1109,7 +1117,7 @@ AqlValue Functions::Union (triagens::aql::Query* query,
AqlValue Functions::UnionDistinct (triagens::aql::Query* query, AqlValue Functions::UnionDistinct (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
if (parameters.arraySize() < 2) { if (parameters.arraySize() < 2) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNION_DISTINCT"); THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNION_DISTINCT");
} }
@ -1199,7 +1207,7 @@ AqlValue Functions::UnionDistinct (triagens::aql::Query* query,
AqlValue Functions::Intersection (triagens::aql::Query* query, AqlValue Functions::Intersection (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
TRI_document_collection_t const* collection, TRI_document_collection_t const* collection,
AqlValue const parameters) { FunctionParameters parameters) {
size_t const n = parameters.arraySize(); size_t const n = parameters.arraySize();
if (parameters.arraySize() < 2) { if (parameters.arraySize() < 2) {

View File

@ -42,42 +42,48 @@ namespace triagens {
class Query; class Query;
// -----------------------------------------------------------------------------
// --SECTION-- public typedefs
// -----------------------------------------------------------------------------
typedef AqlValue const FunctionParameters;
typedef std::function<AqlValue(triagens::aql::Query*, typedef std::function<AqlValue(triagens::aql::Query*,
triagens::arango::AqlTransaction*, triagens::arango::AqlTransaction*,
TRI_document_collection_t const*, TRI_document_collection_t const*,
AqlValue const)> FunctionImplementation; FunctionParameters)> FunctionImplementation;
// -----------------------------------------------------------------------------
// --SECTION-- AQL function bindings
// -----------------------------------------------------------------------------
struct Functions { struct Functions {
//////////////////////////////////////////////////////////////////////////////// static AqlValue IsNull (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
/// @brief functions static AqlValue IsBool (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
//////////////////////////////////////////////////////////////////////////////// static AqlValue IsNumber (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsString (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsNull (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue IsArray (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsBool (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue IsObject (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsNumber (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Length (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsString (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Concat (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsArray (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Passthru (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue IsObject (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Unset (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Length (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Keep (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Concat (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Merge (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Passthru (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Has (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Unset (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Attributes (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Keep (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Values (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Merge (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Min (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Has (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Max (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Attributes (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Sum (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Values (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Average (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Min (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Md5 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Max (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Sha1 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Sum (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Unique (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Average (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Union (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Md5 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue UnionDistinct (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Sha1 (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const); static AqlValue Intersection (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, FunctionParameters);
static AqlValue Unique (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Union (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue UnionDistinct (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
static AqlValue Intersection (triagens::aql::Query*, triagens::arango::AqlTransaction*, TRI_document_collection_t const*, AqlValue const);
}; };
} }

View File

@ -54,6 +54,14 @@
}; };
}, },
calculateCenterDivHeight: function() {
var navigation = $('.navbar').height();
var footer = $('.footer').height();
var windowHeight = $(window).height();
return windowHeight - footer - navigation - 110;
},
fixTooltips: function (selector, placement) { fixTooltips: function (selector, placement) {
$(selector).tooltip({ $(selector).tooltip({
placement: placement, placement: placement,
@ -2168,8 +2176,6 @@ window.StatisticsCollection = Backbone.Collection.extend({
{async: true} {async: true}
).done( ).done(
function (d) { function (d) {
console.log(url + urlParams);
console.log(d);
if (d.times.length > 0) { if (d.times.length > 0) {
self.isUpdating = true; self.isUpdating = true;
self.mergeHistory(d); self.mergeHistory(d);

View File

@ -4104,7 +4104,6 @@ svg.graph-viewer {
pointer-events: none; } pointer-events: none; }
div.gv-background { div.gv-background {
height: 685px;
position: relative; } position: relative; }
.link > line { .link > line {

View File

@ -54,6 +54,14 @@
}; };
}, },
calculateCenterDivHeight: function() {
var navigation = $('.navbar').height();
var footer = $('.footer').height();
var windowHeight = $(window).height();
return windowHeight - footer - navigation - 110;
},
fixTooltips: function (selector, placement) { fixTooltips: function (selector, placement) {
$(selector).tooltip({ $(selector).tooltip({
placement: placement, placement: placement,

View File

@ -141,7 +141,7 @@ global.tutorial = require("org/arangodb/tutorial");
/// @brief prints help /// @brief prints help
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
(function() { var initHelp = function() {
var internal = require("internal"); var internal = require("internal");
if (internal.db) { if (internal.db) {
@ -158,11 +158,16 @@ global.tutorial = require("org/arangodb/tutorial");
internal.print("Type 'tutorial' for a tutorial or 'help' to see common examples"); internal.print("Type 'tutorial' for a tutorial or 'help' to see common examples");
} }
} }
};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief read rc file /// @brief read rc file
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
if (typeof window === 'undefined') {
// We're in arangosh
initHelp();
// these variables are not defined in the browser context // these variables are not defined in the browser context
if ( if (
global.IS_EXECUTE_SCRIPT || global.IS_EXECUTE_SCRIPT ||
@ -194,7 +199,7 @@ global.tutorial = require("org/arangodb/tutorial");
delete global.IS_UNIT_TESTS; delete global.IS_UNIT_TESTS;
delete global.IS_JS_LINT; delete global.IS_JS_LINT;
} catch (e) {} } catch (e) {}
}()); }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE // --SECTION-- END-OF-FILE

View File

@ -45,7 +45,10 @@
}; };
var width = $("#content").width() - 75; var width = $("#content").width() - 75;
$("#content").html(""); $("#content").html("");
this.ui = new GraphViewerUI($("#content")[0], adapterConfig, width, 680, {
var height = arangoHelper.calculateCenterDivHeight();
this.ui = new GraphViewerUI($("#content")[0], adapterConfig, width, height, {
nodeShaper: { nodeShaper: {
label: "_key", label: "_key",
color: { color: {
@ -56,6 +59,8 @@
}, true); }, true);
$('.contentDiv').height(height);
}, },
handleResize: function(w) { handleResize: function(w) {

View File

@ -70,7 +70,6 @@ svg.graph-viewer {
} }
div.gv-background { div.gv-background {
height: 685px;
position: relative; position: relative;
} }

View File

@ -141,7 +141,7 @@ global.tutorial = require("org/arangodb/tutorial");
/// @brief prints help /// @brief prints help
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
(function() { var initHelp = function() {
var internal = require("internal"); var internal = require("internal");
if (internal.db) { if (internal.db) {
@ -158,11 +158,16 @@ global.tutorial = require("org/arangodb/tutorial");
internal.print("Type 'tutorial' for a tutorial or 'help' to see common examples"); internal.print("Type 'tutorial' for a tutorial or 'help' to see common examples");
} }
} }
};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief read rc file /// @brief read rc file
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
if (typeof window === 'undefined') {
// We're in arangosh
initHelp();
// these variables are not defined in the browser context // these variables are not defined in the browser context
if ( if (
global.IS_EXECUTE_SCRIPT || global.IS_EXECUTE_SCRIPT ||
@ -194,7 +199,7 @@ global.tutorial = require("org/arangodb/tutorial");
delete global.IS_UNIT_TESTS; delete global.IS_UNIT_TESTS;
delete global.IS_JS_LINT; delete global.IS_JS_LINT;
} catch (e) {} } catch (e) {}
}()); }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE // --SECTION-- END-OF-FILE

View File

@ -133,6 +133,7 @@ struct TRI_log_appender_t {
virtual void closeLog () = 0; virtual void closeLog () = 0;
virtual char* details () = 0; virtual char* details () = 0;
virtual TRI_log_appender_type_e type () = 0; virtual TRI_log_appender_type_e type () = 0;
virtual char const* typeName () = 0;
char* _contentFilter; // an optional content filter for log messages char* _contentFilter; // an optional content filter for log messages
TRI_log_severity_e _severityFilter; // appender will care only about message with a specific severity. set to TRI_LOG_SEVERITY_UNKNOWN to catch all TRI_log_severity_e _severityFilter; // appender will care only about message with a specific severity. set to TRI_LOG_SEVERITY_UNKNOWN to catch all
@ -854,14 +855,16 @@ static void LogThread (char const* func,
} }
else else
#endif #endif
{ try {
std::string message("format string is corrupt: ["); std::string message("format string is corrupt: [");
message += fmt + std::string("] - GenerateMessage failed"); message += fmt + std::string("] - GenerateMessage failed");
TRI_GetBacktrace(message); TRI_GetBacktrace(message);
DisarmFormatString(message); DisarmFormatString(message);
TRI_Log(func, file, line, TRI_LOG_LEVEL_WARNING, TRI_LOG_SEVERITY_HUMAN, message.c_str()); TRI_Log(func, file, line, TRI_LOG_LEVEL_WARNING, TRI_LOG_SEVERITY_HUMAN, message.c_str());
return;
} }
catch (...) {
}
return;
} }
if (n < (int) (sizeof(buffer) - len)) { if (n < (int) (sizeof(buffer) - len)) {
// static buffer was big enough // static buffer was big enough
@ -901,11 +904,15 @@ static void LogThread (char const* func,
#endif #endif
{ {
TRI_Free(TRI_UNKNOWN_MEM_ZONE, p); TRI_Free(TRI_UNKNOWN_MEM_ZONE, p);
std::string message("format string is corrupt: ["); try {
message += fmt + std::string("] "); std::string message("format string is corrupt: [");
TRI_GetBacktrace(message); message += fmt + std::string("] ");
DisarmFormatString(message); TRI_GetBacktrace(message);
TRI_Log(func, file, line, TRI_LOG_LEVEL_WARNING, TRI_LOG_SEVERITY_HUMAN, message.c_str()); DisarmFormatString(message);
TRI_Log(func, file, line, TRI_LOG_LEVEL_WARNING, TRI_LOG_SEVERITY_HUMAN, message.c_str());
}
catch (...) {
}
return; return;
} }
} }
@ -1327,6 +1334,10 @@ struct log_appender_file_t : public TRI_log_appender_t {
return APPENDER_TYPE_FILE; return APPENDER_TYPE_FILE;
} }
char const* typeName () override final {
return "file";
}
private: private:
void writeLogFile (int, char const*, ssize_t); void writeLogFile (int, char const*, ssize_t);
@ -1614,6 +1625,10 @@ struct log_appender_syslog_t : public TRI_log_appender_t {
return APPENDER_TYPE_SYSLOG; return APPENDER_TYPE_SYSLOG;
} }
char const* typeName () override final {
return "syslog";
}
private: private:
triagens::basics::Mutex _lock; triagens::basics::Mutex _lock;
@ -1932,7 +1947,13 @@ void TRI_ReopenLogging () {
MUTEX_LOCKER(AppendersLock); MUTEX_LOCKER(AppendersLock);
for (auto& it : Appenders) { for (auto& it : Appenders) {
it->reopenLog(); try {
it->reopenLog();
}
catch (...) {
// silently catch this error (we shouldn't try to log an error about a
// logging error as this will get us into trouble with mutexes etc.)
}
} }
} }

View File

@ -154,17 +154,25 @@ void DispatcherThread::run () {
status = Job::status_t(Job::JOB_FAILED); status = Job::status_t(Job::JOB_FAILED);
} }
catch (std::exception const& ex) { catch (std::bad_alloc const& ex) {
try { try {
Exception ex2(TRI_ERROR_INTERNAL, string("job failed with unknown in work: ") + ex.what(), __FILE__, __LINE__); Exception ex2(TRI_ERROR_OUT_OF_MEMORY, string("job failed with unknown error in work(): ") + ex.what(), __FILE__, __LINE__);
job->handleError(ex2); job->handleError(ex2);
LOG_WARNING("caught exception in work(): %s", ex2.what());
} }
catch (Exception const& ex) { catch (...) {
LOG_WARNING("caught error while handling error: %s", ex.what()); LOG_WARNING("caught error while handling error!");
} }
catch (std::exception const& ex) {
LOG_WARNING("caught error while handling error: %s", ex.what()); status = Job::status_t(Job::JOB_FAILED);
}
catch (std::exception const& ex) {
try {
Exception ex2(TRI_ERROR_INTERNAL, string("job failed with unknown error in work(): ") + ex.what(), __FILE__, __LINE__);
job->handleError(ex2);
LOG_WARNING("caught exception in work(): %s", ex2.what());
} }
catch (...) { catch (...) {
LOG_WARNING("caught error while handling error!"); LOG_WARNING("caught error while handling error!");
@ -181,15 +189,10 @@ void DispatcherThread::run () {
#endif #endif
try { try {
Exception ex(TRI_ERROR_INTERNAL, "job failed with unknown error in work", __FILE__, __LINE__); Exception ex(TRI_ERROR_INTERNAL, "job failed with unknown error in work()", __FILE__, __LINE__);
job->handleError(ex); job->handleError(ex);
} LOG_WARNING("caught unknown exception in work()");
catch (Exception const& ex) {
LOG_WARNING("caught error while handling error: %s", DIAGNOSTIC_INFORMATION(ex));
}
catch (std::exception const& ex) {
LOG_WARNING("caught error while handling error: %s", ex.what());
} }
catch (...) { catch (...) {
LOG_WARNING("caught error while handling error!"); LOG_WARNING("caught error while handling error!");