mirror of https://gitee.com/bigwinds/arangodb
commit
e42098424a
|
@ -30,7 +30,7 @@ boost
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
~error_info_base() throw()
|
virtual ~error_info_base() throw()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,4 +18,4 @@
|
||||||
#include <boost/fusion/tuple/detail/preprocessed/make_tuple50.hpp>
|
#include <boost/fusion/tuple/detail/preprocessed/make_tuple50.hpp>
|
||||||
#else
|
#else
|
||||||
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,4 +18,4 @@
|
||||||
#include <boost/fusion/tuple/detail/preprocessed/tuple50.hpp>
|
#include <boost/fusion/tuple/detail/preprocessed/tuple50.hpp>
|
||||||
#else
|
#else
|
||||||
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,4 +18,4 @@
|
||||||
#include <boost/fusion/tuple/detail/preprocessed/tuple50_fwd.hpp>
|
#include <boost/fusion/tuple/detail/preprocessed/tuple50_fwd.hpp>
|
||||||
#else
|
#else
|
||||||
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,4 +18,4 @@
|
||||||
#include <boost/fusion/tuple/detail/preprocessed/tuple_tie50.hpp>
|
#include <boost/fusion/tuple/detail/preprocessed/tuple_tie50.hpp>
|
||||||
#else
|
#else
|
||||||
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
#error "FUSION_MAX_VECTOR_SIZE out of bounds for preprocessed headers"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -35,20 +35,6 @@
|
||||||
/// @{
|
/// @{
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// --SECTIONS-- triagens namespace
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace triagens {
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
typedef TRI_blob_t blob_t;
|
|
||||||
typedef TRI_datetime_t datetime_t;
|
|
||||||
typedef TRI_date_t date_t;
|
|
||||||
typedef TRI_seconds_t seconds_t;
|
|
||||||
typedef TRI_msec_t msec_t;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- C++ header files that are always present on all systems
|
// --SECTION-- C++ header files that are always present on all systems
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -65,6 +51,20 @@ namespace triagens {
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// --SECTIONS-- triagens namespace
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace triagens {
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
typedef TRI_blob_t blob_t;
|
||||||
|
typedef TRI_datetime_t datetime_t;
|
||||||
|
typedef TRI_date_t date_t;
|
||||||
|
typedef TRI_seconds_t seconds_t;
|
||||||
|
typedef TRI_msec_t msec_t;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- noncopyable class
|
// --SECTION-- noncopyable class
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -186,7 +186,7 @@ char const* TRI_last_error () {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
err = eptr->_number;
|
err = eptr->_number;
|
||||||
err = eptr->_sys;
|
sys = eptr->_sys;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -229,6 +229,7 @@ int TRI_set_errno (int error) {
|
||||||
#elif defined(TRI_HAVE_POSIX_THREADS)
|
#elif defined(TRI_HAVE_POSIX_THREADS)
|
||||||
|
|
||||||
tri_error_t* eptr;
|
tri_error_t* eptr;
|
||||||
|
int copyErrno = errno;
|
||||||
|
|
||||||
eptr = pthread_getspecific(ErrorKey);
|
eptr = pthread_getspecific(ErrorKey);
|
||||||
|
|
||||||
|
@ -240,7 +241,7 @@ int TRI_set_errno (int error) {
|
||||||
eptr->_number = error;
|
eptr->_number = error;
|
||||||
|
|
||||||
if (error == TRI_ERROR_SYS_ERROR) {
|
if (error == TRI_ERROR_SYS_ERROR) {
|
||||||
eptr->_sys = errno;
|
eptr->_sys = copyErrno;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
eptr->_sys = 0;
|
eptr->_sys = 0;
|
||||||
|
|
|
@ -92,11 +92,11 @@ namespace triagens {
|
||||||
|
|
||||||
// directly execute the handler within the scheduler thread
|
// directly execute the handler within the scheduler thread
|
||||||
if (handler->isDirect()) {
|
if (handler->isDirect()) {
|
||||||
Handler::status_e status = handleRequestDirectly(task, handler);
|
Handler::status_e status = this->handleRequestDirectly(task, handler);
|
||||||
|
|
||||||
if (status != Handler::HANDLER_REQUEUE) {
|
if (status != Handler::HANDLER_REQUEUE) {
|
||||||
done = true;
|
done = true;
|
||||||
destroyHandler(handler);
|
this->destroyHandler(handler);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
continue;
|
continue;
|
||||||
|
@ -109,7 +109,7 @@ namespace triagens {
|
||||||
|
|
||||||
if (atask == 0) {
|
if (atask == 0) {
|
||||||
LOGGER_WARNING << "task is indirect, but not asynchronous";
|
LOGGER_WARNING << "task is indirect, but not asynchronous";
|
||||||
destroyHandler(handler);
|
this->destroyHandler(handler);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -127,7 +127,7 @@ namespace triagens {
|
||||||
else {
|
else {
|
||||||
LOGGER_WARNING << "no dispatcher is known";
|
LOGGER_WARNING << "no dispatcher is known";
|
||||||
|
|
||||||
destroyHandler(handler);
|
this->destroyHandler(handler);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,7 +217,6 @@ static bool isEqualElementElement (struct TRI_associative_array_s* associativeAr
|
||||||
void* leftElement, void* rightElement) {
|
void* leftElement, void* rightElement) {
|
||||||
HashIndexElement* hLeftElement = (HashIndexElement*)(leftElement);
|
HashIndexElement* hLeftElement = (HashIndexElement*)(leftElement);
|
||||||
HashIndexElement* hRightElement = (HashIndexElement*)(rightElement);
|
HashIndexElement* hRightElement = (HashIndexElement*)(rightElement);
|
||||||
int result;
|
|
||||||
|
|
||||||
if (leftElement == NULL || rightElement == NULL) {
|
if (leftElement == NULL || rightElement == NULL) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -245,7 +244,6 @@ static bool isEqualKeyElement (struct TRI_associative_array_s* associativeArray,
|
||||||
void* leftElement, void* rightElement) {
|
void* leftElement, void* rightElement) {
|
||||||
HashIndexElement* hLeftElement = (HashIndexElement*)(leftElement);
|
HashIndexElement* hLeftElement = (HashIndexElement*)(leftElement);
|
||||||
HashIndexElement* hRightElement = (HashIndexElement*)(rightElement);
|
HashIndexElement* hRightElement = (HashIndexElement*)(rightElement);
|
||||||
int result;
|
|
||||||
|
|
||||||
if (leftElement == NULL || rightElement == NULL) {
|
if (leftElement == NULL || rightElement == NULL) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -270,7 +268,7 @@ static bool isEqualKeyElement (struct TRI_associative_array_s* associativeArray,
|
||||||
// .............................................................................
|
// .............................................................................
|
||||||
// The actual hashing occurs here
|
// The actual hashing occurs here
|
||||||
// .............................................................................
|
// .............................................................................
|
||||||
static size_t hashElement (struct TRI_associative_array_s* associativeArray, void* element) {
|
static uint64_t hashElement (struct TRI_associative_array_s* associativeArray, void* element) {
|
||||||
HashIndexElement* hElement = (HashIndexElement*)(element);
|
HashIndexElement* hElement = (HashIndexElement*)(element);
|
||||||
size_t hash = TRI_InitialCrc32();
|
size_t hash = TRI_InitialCrc32();
|
||||||
|
|
||||||
|
@ -284,7 +282,7 @@ static size_t hashElement (struct TRI_associative_array_s* associativeArray, voi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static size_t hashKey (struct TRI_associative_array_s* associativeArray, void* element) {
|
static uint64_t hashKey (struct TRI_associative_array_s* associativeArray, void* element) {
|
||||||
HashIndexElement* hElement = (HashIndexElement*)(element);
|
HashIndexElement* hElement = (HashIndexElement*)(element);
|
||||||
size_t hash = TRI_InitialCrc32();
|
size_t hash = TRI_InitialCrc32();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[action]
|
||||||
|
threads = 4
|
||||||
|
|
||||||
|
[log]
|
||||||
|
level = info
|
||||||
|
severity = human
|
||||||
|
file = /var/log/voc/avocado.log
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Disabled</key>
|
||||||
|
<false/>
|
||||||
|
|
||||||
|
<key>Label</key>
|
||||||
|
<string>org.avocadodb</string>
|
||||||
|
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/usr/sbin/avocado</string>
|
||||||
|
<string>-c</string>
|
||||||
|
<string>/etc/voc/avocado.conf</string>
|
||||||
|
</array>
|
||||||
|
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -46,7 +46,7 @@ namespace triagens {
|
||||||
class HttpRequest;
|
class HttpRequest;
|
||||||
|
|
||||||
namespace InputParser {
|
namespace InputParser {
|
||||||
class ObjectDescriptionImpl;
|
struct ObjectDescriptionImpl;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @ingroup Utilities
|
/// @ingroup Utilities
|
||||||
|
|
|
@ -838,6 +838,7 @@ static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
|
||||||
static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
|
static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define YY_NO_INPUT
|
||||||
#ifndef YY_NO_INPUT
|
#ifndef YY_NO_INPUT
|
||||||
/* %if-c-only Standard (non-C++) definition */
|
/* %if-c-only Standard (non-C++) definition */
|
||||||
/* %not-for-header */
|
/* %not-for-header */
|
||||||
|
|
|
@ -128,7 +128,7 @@ namespace triagens { namespace json_parser {
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
(pos1.filename == pos2.filename
|
(pos1.filename == pos2.filename
|
||||||
|| pos1.filename && pos2.filename && *pos1.filename == *pos2.filename)
|
|| (pos1.filename && pos2.filename && *pos1.filename == *pos2.filename))
|
||||||
&& pos1.line == pos2.line && pos1.column == pos2.column;
|
&& pos1.line == pos2.line && pos1.column == pos2.column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
40
Makefile.am
40
Makefile.am
|
@ -1,15 +1,39 @@
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
AM_CFLAGS =
|
AM_CPPFLAGS = \
|
||||||
AM_CXXFLAGS =
|
-D_SYSCONFDIR_='"${sysconfdir}"' \
|
||||||
AM_CPPFLAGS = -D_SYSCONFDIR_='"${sysconfdir}"' -D_PKGDATADIR_='"${pkgdatadir}"' -D_DATABASEDIR_='"${localstatedir}/${PACKAGE_TARNAME}"'
|
-D_PKGDATADIR_='"${pkgdatadir}"' \
|
||||||
AM_LDFLAGS =
|
-D_DATABASEDIR_='"${localstatedir}/${PACKAGE_TARNAME}"' \
|
||||||
|
@BOOST_CPPFLAGS@ \
|
||||||
|
@LIBEV_CPPFLAGS@ \
|
||||||
|
@MATH_CPPFLAGS@ \
|
||||||
|
@NCURSES_CPPFLAGS@ \
|
||||||
|
@OPENSSL_CPPFLAGS@ \
|
||||||
|
@READLINE_CPPFLAGS@ \
|
||||||
|
@V8_CPPFLAGS@
|
||||||
|
|
||||||
|
AM_LDFLAGS = \
|
||||||
|
@BOOST_LDFLAGS@ \
|
||||||
|
@LIBEV_LDFLAGS@ \
|
||||||
|
@MATH_LDFLAGS@ \
|
||||||
|
@NCURSES_LDFLAGS@ \
|
||||||
|
@OPENSSL_LDFLAGS@ \
|
||||||
|
@READLINE_LDFLAGS@ \
|
||||||
|
@V8_LDFLAGS@
|
||||||
|
|
||||||
|
LIBS = \
|
||||||
|
@BOOST_LIBS@ \
|
||||||
|
@LIBEV_LIBS@ \
|
||||||
|
@MATH_LIBS@ \
|
||||||
|
@NCURSES_LIBS@ \
|
||||||
|
@OPENSSL_LIBS@ \
|
||||||
|
@READLINE_LIBS@ \
|
||||||
|
@V8_LIBS@
|
||||||
|
|
||||||
BUILT_SOURCES =
|
BUILT_SOURCES =
|
||||||
CLEANUP =
|
CLEANUP =
|
||||||
LIBS =
|
|
||||||
|
|
||||||
noinst_LIBRARIES = libavocadodb.a
|
sbin_PROGRAMS = avocado
|
||||||
bin_PROGRAMS = avocado
|
|
||||||
|
|
||||||
nobase_pkgdata_DATA = \
|
nobase_pkgdata_DATA = \
|
||||||
$(shell find @srcdir@/js/system -name "*.js" -print) \
|
$(shell find @srcdir@/js/system -name "*.js" -print) \
|
||||||
|
@ -25,7 +49,7 @@ install-data-local:
|
||||||
test -d @localstatedir@//${PACKAGE_TARNAME} || mkdir -p @localstatedir@//${PACKAGE_TARNAME}
|
test -d @localstatedir@//${PACKAGE_TARNAME} || mkdir -p @localstatedir@//${PACKAGE_TARNAME}
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
## avocado
|
## avocadodb
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
include Makefile.files
|
include Makefile.files
|
||||||
|
|
|
@ -54,6 +54,6 @@ wiki: $(WIKI)
|
||||||
## CLEANUP
|
## CLEANUP
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
CLEANUP += $(DOXYGEN) $(WIKI)
|
CLEANUP += $(DOXYGEN) $(WIKI) $(subst Doxygen/xml,Doxygen/wiki,$(WIKI))
|
||||||
|
|
||||||
|
|
||||||
|
|
105
Makefile.files
105
Makefile.files
|
@ -4,17 +4,7 @@
|
||||||
## avocadodb
|
## avocadodb
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
libavocadodb_a_CPPFLAGS = \
|
avocado_SOURCES = \
|
||||||
$(AM_CPPFLAGS) \
|
|
||||||
@BOOST_CPPFLAGS@ \
|
|
||||||
@LIBEV_CPPFLAGS@ \
|
|
||||||
@MATH_CPPFLAGS@ \
|
|
||||||
@NCURSES_CPPFLAGS@ \
|
|
||||||
@OPENSSL_CPPFLAGS@ \
|
|
||||||
@READLINE_CPPFLAGS@ \
|
|
||||||
@V8_CPPFLAGS@
|
|
||||||
|
|
||||||
libavocadodb_a_SOURCES = \
|
|
||||||
Admin/ApplicationAdminServer.cpp \
|
Admin/ApplicationAdminServer.cpp \
|
||||||
Admin/RestAdminBaseHandler.cpp \
|
Admin/RestAdminBaseHandler.cpp \
|
||||||
Admin/RestAdminFeConfigurationHandler.cpp \
|
Admin/RestAdminFeConfigurationHandler.cpp \
|
||||||
|
@ -99,6 +89,16 @@ libavocadodb_a_SOURCES = \
|
||||||
Logger/LoggerStream.cpp \
|
Logger/LoggerStream.cpp \
|
||||||
Logger/LoggerTiming.cpp \
|
Logger/LoggerTiming.cpp \
|
||||||
ProgramOptions/program-options.c \
|
ProgramOptions/program-options.c \
|
||||||
|
QL/ParserWrapper.cpp \
|
||||||
|
QL/ast-node.c \
|
||||||
|
QL/ast-query.c \
|
||||||
|
QL/error.c \
|
||||||
|
QL/formatter.c \
|
||||||
|
QL/javascripter.c \
|
||||||
|
QL/optimize.c \
|
||||||
|
QL/parser-context.c \
|
||||||
|
QL/parser.c \
|
||||||
|
QL/tokens.c \
|
||||||
Rest/AddressPort.cpp \
|
Rest/AddressPort.cpp \
|
||||||
Rest/AnyServer.cpp \
|
Rest/AnyServer.cpp \
|
||||||
Rest/HttpRequest.cpp \
|
Rest/HttpRequest.cpp \
|
||||||
|
@ -106,6 +106,16 @@ libavocadodb_a_SOURCES = \
|
||||||
Rest/Initialise.cpp \
|
Rest/Initialise.cpp \
|
||||||
Rest/SslInterface.cpp \
|
Rest/SslInterface.cpp \
|
||||||
Rest/Url.cpp \
|
Rest/Url.cpp \
|
||||||
|
RestHandler/RestActionHandler.cpp \
|
||||||
|
RestHandler/RestDocumentHandler.cpp \
|
||||||
|
RestHandler/RestSystemActionHandler.cpp \
|
||||||
|
RestHandler/RestVocbaseBaseHandler.cpp \
|
||||||
|
RestServer/ActionDispatcherThread.cpp \
|
||||||
|
RestServer/AvocadoHttpServer.cpp \
|
||||||
|
RestServer/AvocadoServer.cpp \
|
||||||
|
RestServer/JSLoader.cpp \
|
||||||
|
RestServer/SystemActionDispatcherThread.cpp \
|
||||||
|
RestServer/avocado.cpp \
|
||||||
ResultGenerator/HtmlResultGenerator.cpp \
|
ResultGenerator/HtmlResultGenerator.cpp \
|
||||||
ResultGenerator/Initialise.cpp \
|
ResultGenerator/Initialise.cpp \
|
||||||
ResultGenerator/JsonResultGenerator.cpp \
|
ResultGenerator/JsonResultGenerator.cpp \
|
||||||
|
@ -130,11 +140,11 @@ libavocadodb_a_SOURCES = \
|
||||||
ShapedJson/shape-accessor.c \
|
ShapedJson/shape-accessor.c \
|
||||||
ShapedJson/shaped-json.c \
|
ShapedJson/shaped-json.c \
|
||||||
V8/v8-actions.cpp \
|
V8/v8-actions.cpp \
|
||||||
|
V8/v8-conv.cpp \
|
||||||
V8/v8-json.cpp \
|
V8/v8-json.cpp \
|
||||||
|
V8/v8-line-editor.cpp \
|
||||||
V8/v8-shell.cpp \
|
V8/v8-shell.cpp \
|
||||||
V8/v8-utils.cpp \
|
V8/v8-utils.cpp \
|
||||||
V8/v8-conv.cpp \
|
|
||||||
V8/v8-line-editor.cpp \
|
|
||||||
V8/v8-vocbase.cpp \
|
V8/v8-vocbase.cpp \
|
||||||
Variant/VariantArray.cpp \
|
Variant/VariantArray.cpp \
|
||||||
Variant/VariantBlob.cpp \
|
Variant/VariantBlob.cpp \
|
||||||
|
@ -156,79 +166,25 @@ libavocadodb_a_SOURCES = \
|
||||||
Variant/VariantUInt64.cpp \
|
Variant/VariantUInt64.cpp \
|
||||||
Variant/VariantUInt8.cpp \
|
Variant/VariantUInt8.cpp \
|
||||||
Variant/VariantVector.cpp \
|
Variant/VariantVector.cpp \
|
||||||
VocBase/data-feeder.c \
|
|
||||||
VocBase/join-execute.c \
|
|
||||||
VocBase/order.c \
|
|
||||||
VocBase/blob-collection.c \
|
VocBase/blob-collection.c \
|
||||||
VocBase/collection.c \
|
VocBase/collection.c \
|
||||||
VocBase/compactor.c \
|
VocBase/compactor.c \
|
||||||
|
VocBase/data-feeder.c \
|
||||||
VocBase/datafile.c \
|
VocBase/datafile.c \
|
||||||
VocBase/document-collection.c \
|
VocBase/document-collection.c \
|
||||||
VocBase/fluent-query.c \
|
VocBase/fluent-query.c \
|
||||||
VocBase/select-result.c \
|
|
||||||
VocBase/join.c \
|
|
||||||
VocBase/query.c \
|
|
||||||
VocBase/headers.c \
|
VocBase/headers.c \
|
||||||
VocBase/index.c \
|
VocBase/index.c \
|
||||||
|
VocBase/join-execute.c \
|
||||||
|
VocBase/join.c \
|
||||||
|
VocBase/order.c \
|
||||||
|
VocBase/query.c \
|
||||||
VocBase/result-set.c \
|
VocBase/result-set.c \
|
||||||
|
VocBase/select-result.c \
|
||||||
VocBase/simple-collection.c \
|
VocBase/simple-collection.c \
|
||||||
VocBase/synchroniser.c \
|
VocBase/synchroniser.c \
|
||||||
VocBase/voc-shaper.c \
|
VocBase/voc-shaper.c \
|
||||||
VocBase/vocbase.c \
|
VocBase/vocbase.c
|
||||||
QL/ParserWrapper.cpp \
|
|
||||||
QL/ast-node.c \
|
|
||||||
QL/ast-query.c \
|
|
||||||
QL/error.c \
|
|
||||||
QL/formatter.c \
|
|
||||||
QL/javascripter.c \
|
|
||||||
QL/optimize.c \
|
|
||||||
QL/parser-context.c \
|
|
||||||
QL/parser.c \
|
|
||||||
QL/tokens.c
|
|
||||||
|
|
||||||
avocado_CPPFLAGS = \
|
|
||||||
$(AM_CPPFLAGS) \
|
|
||||||
@BOOST_CPPFLAGS@ \
|
|
||||||
@LIBEV_CPPFLAGS@ \
|
|
||||||
@MATH_CPPFLAGS@ \
|
|
||||||
@NCURSES_CPPFLAGS@ \
|
|
||||||
@OPENSSL_CPPFLAGS@ \
|
|
||||||
@READLINE_CPPFLAGS@ \
|
|
||||||
@V8_CPPFLAGS@
|
|
||||||
|
|
||||||
avocado_LDFLAGS = \
|
|
||||||
-L. \
|
|
||||||
@BOOST_LDFLAGS@ \
|
|
||||||
@LIBEV_LDFLAGS@ \
|
|
||||||
@MATH_LDFLAGS@ \
|
|
||||||
@NCURSES_LDFLAGS@ \
|
|
||||||
@OPENSSL_LDFLAGS@ \
|
|
||||||
@READLINE_LDFLAGS@ \
|
|
||||||
@V8_LDFLAGS@
|
|
||||||
|
|
||||||
avocado_LDADD = \
|
|
||||||
-lavocadodb \
|
|
||||||
@BOOST_LIBS@ \
|
|
||||||
@LIBEV_LIBS@ \
|
|
||||||
@MATH_LIBS@ \
|
|
||||||
@NCURSES_LIBS@ \
|
|
||||||
@OPENSSL_LIBS@ \
|
|
||||||
@READLINE_LIBS@ \
|
|
||||||
@V8_LIBS@
|
|
||||||
|
|
||||||
avocado_DEPENDENCIES = @builddir@/libavocadodb.a
|
|
||||||
|
|
||||||
avocado_SOURCES = \
|
|
||||||
RestHandler/RestActionHandler.cpp \
|
|
||||||
RestHandler/RestDocumentHandler.cpp \
|
|
||||||
RestHandler/RestSystemActionHandler.cpp \
|
|
||||||
RestHandler/RestVocbaseBaseHandler.cpp \
|
|
||||||
RestServer/ActionDispatcherThread.cpp \
|
|
||||||
RestServer/AvocadoHttpServer.cpp \
|
|
||||||
RestServer/AvocadoServer.cpp \
|
|
||||||
RestServer/JSLoader.cpp \
|
|
||||||
RestServer/SystemActionDispatcherThread.cpp \
|
|
||||||
RestServer/avocado.cpp
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
## JavaScript source code as header
|
## JavaScript source code as header
|
||||||
|
@ -243,7 +199,6 @@ JAVASCRIPT_HEADER = \
|
||||||
js/server/js-json.h \
|
js/server/js-json.h \
|
||||||
js/server/js-shell.h
|
js/server/js-shell.h
|
||||||
|
|
||||||
|
|
||||||
BUILT_SOURCES += $(JAVASCRIPT_HEADER)
|
BUILT_SOURCES += $(JAVASCRIPT_HEADER)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
5173
Makefile.in
5173
Makefile.in
File diff suppressed because it is too large
Load Diff
|
@ -1348,9 +1348,7 @@ bool TRI_ParseArgumentsProgramOptions (TRI_program_options_t * options,
|
||||||
int argc,
|
int argc,
|
||||||
char ** argv) {
|
char ** argv) {
|
||||||
extern char *optarg;
|
extern char *optarg;
|
||||||
extern int opterr;
|
|
||||||
extern int optind;
|
extern int optind;
|
||||||
extern int optopt;
|
|
||||||
|
|
||||||
TRI_string_buffer_t buffer;
|
TRI_string_buffer_t buffer;
|
||||||
TRI_PO_item_t * item;
|
TRI_PO_item_t * item;
|
||||||
|
|
|
@ -208,6 +208,32 @@ QL_ast_node_type_group_e QLAstNodeGetTypeGroup (const QL_ast_node_type_e type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief get the reverse of a relational operator
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
QL_ast_node_type_e QLAstNodeGetReversedRelationalOperator (const QL_ast_node_type_e type) {
|
||||||
|
if (type == QLNodeBinaryOperatorIdentical ||
|
||||||
|
type == QLNodeBinaryOperatorEqual ||
|
||||||
|
type == QLNodeBinaryOperatorUnidentical ||
|
||||||
|
type == QLNodeBinaryOperatorUnequal) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
if (type == QLNodeBinaryOperatorLess) {
|
||||||
|
return QLNodeBinaryOperatorGreaterEqual;
|
||||||
|
}
|
||||||
|
if (type == QLNodeBinaryOperatorLessEqual) {
|
||||||
|
return QLNodeBinaryOperatorGreater;
|
||||||
|
}
|
||||||
|
if (type == QLNodeBinaryOperatorGreater) {
|
||||||
|
return QLNodeBinaryOperatorLessEqual;
|
||||||
|
}
|
||||||
|
if (type == QLNodeBinaryOperatorGreaterEqual) {
|
||||||
|
return QLNodeBinaryOperatorLess;
|
||||||
|
}
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief get the label string for a unary operator
|
/// @brief get the label string for a unary operator
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -169,6 +169,12 @@ const char* QLAstNodeGetName (const QL_ast_node_type_e);
|
||||||
|
|
||||||
QL_ast_node_type_group_e QLAstNodeGetTypeGroup (const QL_ast_node_type_e);
|
QL_ast_node_type_group_e QLAstNodeGetTypeGroup (const QL_ast_node_type_e);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief get the reverse of a relational operator
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
QL_ast_node_type_e QLAstNodeGetReversedRelationalOperator (const QL_ast_node_type_e);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief get the label string for a unary operator
|
/// @brief get the label string for a unary operator
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -158,6 +158,22 @@ bool QLAstQueryIsValidAlias (QL_ast_query_t* query, const char* alias) {
|
||||||
return (0 != TRI_LookupByKeyAssociativePointer(&query->_from._collections, alias));
|
return (0 != TRI_LookupByKeyAssociativePointer(&query->_from._collections, alias));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Return the collection name for its alias
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
char* QLAstQueryGetCollectionNameForAlias (QL_ast_query_t* query,
|
||||||
|
const char* alias) {
|
||||||
|
QL_ast_query_collection_t* collection;
|
||||||
|
|
||||||
|
collection = (QL_ast_query_collection_t*)
|
||||||
|
TRI_LookupByKeyAssociativePointer(&query->_from._collections, alias);
|
||||||
|
if (!collection) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return collection->_name;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Add a collection to the query
|
/// @brief Add a collection to the query
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -214,6 +214,12 @@ void QLAstQueryAddRefCount (QL_ast_query_t*, const char*);
|
||||||
|
|
||||||
bool QLAstQueryIsValidAlias (QL_ast_query_t*, const char*);
|
bool QLAstQueryIsValidAlias (QL_ast_query_t*, const char*);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Return the collection name for its alias
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
char* QLAstQueryGetCollectionNameForAlias (QL_ast_query_t*, const char*);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Add a collection to the query
|
/// @brief Add a collection to the query
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
143
QL/optimize.c
143
QL/optimize.c
|
@ -208,6 +208,46 @@ double QLOptimizeGetDouble (const QL_ast_node_t const* node) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief check if a document declaration is static or dynamic
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool QLOptimizeIsStaticDocument (QL_ast_node_t* node) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
if (node->_next) {
|
||||||
|
while (node->_next) {
|
||||||
|
result = QLOptimizeIsStaticDocument(node->_next);
|
||||||
|
if (!result) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
node = node->_next;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node->_lhs) {
|
||||||
|
result = QLOptimizeIsStaticDocument(node->_lhs);
|
||||||
|
if (!result) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (node->_rhs) {
|
||||||
|
result = QLOptimizeIsStaticDocument(node->_rhs);
|
||||||
|
if (!result) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (node->_type == QLNodeReferenceCollectionAlias ||
|
||||||
|
node->_type == QLNodeControlFunctionCall ||
|
||||||
|
node->_type == QLNodeControlTernary ||
|
||||||
|
node->_type == QLNodeContainerMemberAccess) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief convert a node to a null value node
|
/// @brief convert a node to a null value node
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -870,6 +910,10 @@ void QLOptimizeFreeRangeVector (TRI_vector_pointer_t* vector) {
|
||||||
if (range->_field) {
|
if (range->_field) {
|
||||||
TRI_Free(range->_field);
|
TRI_Free(range->_field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (range->_refValue._field) {
|
||||||
|
TRI_FreeString(range->_refValue._field);
|
||||||
|
}
|
||||||
TRI_Free(range);
|
TRI_Free(range);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -922,9 +966,20 @@ static TRI_vector_pointer_t* QLOptimizeCombineRanges (const QL_ast_node_type_e t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
previous = QLOptimizeGetRangeByHash(range->_hash, vector);
|
previous = QLOptimizeGetRangeByHash(range->_hash, vector);
|
||||||
|
if (type == QLNodeBinaryOperatorOr) {
|
||||||
|
// only use logical || operator for same field. if field name differs, an ||
|
||||||
|
// effectively kills all ranges
|
||||||
|
if (vector->_length >0 && !previous) {
|
||||||
|
QLOptimizeFreeRangeVector(vector);
|
||||||
|
TRI_InitVectorPointer(vector);
|
||||||
|
goto EXIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!previous) {
|
if (!previous) {
|
||||||
// push range on stack
|
// push range into result vector
|
||||||
TRI_PushBackVectorPointer(vector, range);
|
TRI_PushBackVectorPointer(vector, range);
|
||||||
|
|
||||||
// remove range from original vector to avoid double freeing
|
// remove range from original vector to avoid double freeing
|
||||||
|
@ -1298,6 +1353,7 @@ static QL_optimize_range_t* QLOptimizeCreateRange (QL_ast_node_t* memberNode,
|
||||||
QL_optimize_range_t* range;
|
QL_optimize_range_t* range;
|
||||||
TRI_string_buffer_t* name;
|
TRI_string_buffer_t* name;
|
||||||
QL_ast_node_t* lhs;
|
QL_ast_node_t* lhs;
|
||||||
|
QL_javascript_conversion_t* documentJs;
|
||||||
|
|
||||||
// get the field name
|
// get the field name
|
||||||
name = QLOptimizeGetMemberNameString(memberNode, false);
|
name = QLOptimizeGetMemberNameString(memberNode, false);
|
||||||
|
@ -1313,6 +1369,9 @@ static QL_optimize_range_t* QLOptimizeCreateRange (QL_ast_node_t* memberNode,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
range->_refValue._field = NULL;
|
||||||
|
range->_refValue._collection = NULL;
|
||||||
|
|
||||||
// get value
|
// get value
|
||||||
if (valueNode->_type == QLNodeValueNumberDouble ||
|
if (valueNode->_type == QLNodeValueNumberDouble ||
|
||||||
valueNode->_type == QLNodeValueNumberDoubleString) {
|
valueNode->_type == QLNodeValueNumberDoubleString) {
|
||||||
|
@ -1322,7 +1381,13 @@ static QL_optimize_range_t* QLOptimizeCreateRange (QL_ast_node_t* memberNode,
|
||||||
else if (valueNode->_type == QLNodeValueString) {
|
else if (valueNode->_type == QLNodeValueString) {
|
||||||
// range is of type string
|
// range is of type string
|
||||||
range->_valueType = RANGE_TYPE_STRING;
|
range->_valueType = RANGE_TYPE_STRING;
|
||||||
}
|
}
|
||||||
|
else if (valueNode->_type == QLNodeValueDocument) {
|
||||||
|
range->_valueType = RANGE_TYPE_JSON;
|
||||||
|
}
|
||||||
|
else if (valueNode->_type == QLNodeContainerMemberAccess) {
|
||||||
|
range->_valueType = RANGE_TYPE_FIELD;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
@ -1340,14 +1405,37 @@ static QL_optimize_range_t* QLOptimizeCreateRange (QL_ast_node_t* memberNode,
|
||||||
if (type == QLNodeBinaryOperatorIdentical ||
|
if (type == QLNodeBinaryOperatorIdentical ||
|
||||||
type == QLNodeBinaryOperatorEqual) {
|
type == QLNodeBinaryOperatorEqual) {
|
||||||
// === and == , range is [ value (inc) ... value (inc) ]
|
// === and == , range is [ value (inc) ... value (inc) ]
|
||||||
if (range->_valueType == RANGE_TYPE_DOUBLE) {
|
if (range->_valueType == RANGE_TYPE_FIELD) {
|
||||||
|
range->_refValue._collection =
|
||||||
|
((QL_ast_node_t*) valueNode->_lhs)->_value._stringValue;
|
||||||
|
name = QLOptimizeGetMemberNameString(valueNode, false);
|
||||||
|
if (name) {
|
||||||
|
range->_refValue._field = TRI_DuplicateString(name->_buffer);
|
||||||
|
TRI_FreeStringBuffer(name);
|
||||||
|
TRI_Free(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (range->_valueType == RANGE_TYPE_DOUBLE) {
|
||||||
range->_minValue._doubleValue = QLOptimizeGetDouble(valueNode);
|
range->_minValue._doubleValue = QLOptimizeGetDouble(valueNode);
|
||||||
range->_maxValue._doubleValue = range->_minValue._doubleValue;
|
range->_maxValue._doubleValue = range->_minValue._doubleValue;
|
||||||
}
|
}
|
||||||
else if (range->_valueType == RANGE_TYPE_STRING) {
|
else if (range->_valueType == RANGE_TYPE_STRING) {
|
||||||
range->_minValue._stringValue = valueNode->_value._stringValue;
|
range->_minValue._stringValue = valueNode->_value._stringValue;
|
||||||
range->_maxValue._stringValue = range->_minValue._stringValue;
|
range->_maxValue._stringValue = range->_minValue._stringValue;
|
||||||
}
|
}
|
||||||
|
else if (range->_valueType == RANGE_TYPE_JSON) {
|
||||||
|
documentJs = QLJavascripterInit();
|
||||||
|
if (!documentJs) {
|
||||||
|
TRI_FreeStringBuffer(name);
|
||||||
|
TRI_Free(name);
|
||||||
|
TRI_Free(range);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
QLJavascripterConvert(documentJs, valueNode);
|
||||||
|
range->_minValue._stringValue = documentJs->_buffer->_buffer;
|
||||||
|
range->_maxValue._stringValue = range->_minValue._stringValue;
|
||||||
|
QLJavascripterFree(documentJs);
|
||||||
|
}
|
||||||
range->_minStatus = RANGE_VALUE_INCLUDED;
|
range->_minStatus = RANGE_VALUE_INCLUDED;
|
||||||
range->_maxStatus = RANGE_VALUE_INCLUDED;
|
range->_maxStatus = RANGE_VALUE_INCLUDED;
|
||||||
}
|
}
|
||||||
|
@ -1449,19 +1537,43 @@ TRI_vector_pointer_t* QLOptimizeCondition (QL_ast_node_t* node) {
|
||||||
type == QLNodeBinaryOperatorLessEqual ||
|
type == QLNodeBinaryOperatorLessEqual ||
|
||||||
type == QLNodeBinaryOperatorGreaterEqual) {
|
type == QLNodeBinaryOperatorGreaterEqual) {
|
||||||
// comparison operator
|
// comparison operator
|
||||||
|
|
||||||
if (lhs->_type == QLNodeContainerMemberAccess &&
|
if (lhs->_type == QLNodeContainerMemberAccess &&
|
||||||
|
rhs->_type == QLNodeContainerMemberAccess) {
|
||||||
|
// collection.attribute relop collection.attribute
|
||||||
|
return QLOptimizeMergeRangeVectors(
|
||||||
|
QLOptimizeCreateRangeVector(QLOptimizeCreateRange(lhs, rhs, type)),
|
||||||
|
QLOptimizeCreateRangeVector(QLOptimizeCreateRange(rhs, lhs, type))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (lhs->_type == QLNodeContainerMemberAccess &&
|
||||||
|
(type == QLNodeBinaryOperatorIdentical ||
|
||||||
|
type == QLNodeBinaryOperatorEqual) &&
|
||||||
|
rhs->_type == QLNodeValueDocument &&
|
||||||
|
QLOptimizeIsStaticDocument(rhs)) {
|
||||||
|
// collection.attribute == document
|
||||||
|
return QLOptimizeCreateRangeVector(QLOptimizeCreateRange(lhs, rhs, type));
|
||||||
|
}
|
||||||
|
else if (lhs->_type == QLNodeContainerMemberAccess &&
|
||||||
(rhs->_type == QLNodeValueNumberDouble ||
|
(rhs->_type == QLNodeValueNumberDouble ||
|
||||||
rhs->_type == QLNodeValueNumberDoubleString ||
|
rhs->_type == QLNodeValueNumberDoubleString ||
|
||||||
rhs->_type == QLNodeValueString)) {
|
rhs->_type == QLNodeValueString)) {
|
||||||
// collection.attrbiute relop value
|
// collection.attribute relop value
|
||||||
return QLOptimizeCreateRangeVector(QLOptimizeCreateRange(lhs, rhs, type));
|
return QLOptimizeCreateRangeVector(QLOptimizeCreateRange(lhs, rhs, type));
|
||||||
|
}
|
||||||
|
else if (rhs->_type == QLNodeContainerMemberAccess &&
|
||||||
|
(type == QLNodeBinaryOperatorIdentical ||
|
||||||
|
type == QLNodeBinaryOperatorEqual) &&
|
||||||
|
lhs->_type == QLNodeValueDocument &&
|
||||||
|
QLOptimizeIsStaticDocument(lhs)) {
|
||||||
|
// document == collection.attribute
|
||||||
|
return QLOptimizeCreateRangeVector(QLOptimizeCreateRange(rhs, lhs, type));
|
||||||
} else if (rhs->_type == QLNodeContainerMemberAccess &&
|
} else if (rhs->_type == QLNodeContainerMemberAccess &&
|
||||||
(lhs->_type == QLNodeValueNumberDouble ||
|
(lhs->_type == QLNodeValueNumberDouble ||
|
||||||
lhs->_type == QLNodeValueNumberDoubleString ||
|
lhs->_type == QLNodeValueNumberDoubleString ||
|
||||||
lhs->_type == QLNodeValueString)) {
|
lhs->_type == QLNodeValueString)) {
|
||||||
// value relop collection.attrbiute
|
// value relop collection.attrbiute
|
||||||
return QLOptimizeCreateRangeVector(QLOptimizeCreateRange(rhs, lhs, type));
|
return QLOptimizeCreateRangeVector(
|
||||||
|
QLOptimizeCreateRange(rhs, lhs, QLAstNodeGetReversedRelationalOperator(type)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1555,22 +1667,25 @@ void QLOptimizeDetermineIndexes (QL_ast_query_t* query) {
|
||||||
TRI_index_definition_t* indexDefinition;
|
TRI_index_definition_t* indexDefinition;
|
||||||
QL_ast_node_t* node;
|
QL_ast_node_t* node;
|
||||||
char* collectionName;
|
char* collectionName;
|
||||||
|
char* alias;
|
||||||
size_t i, j, k, matches;
|
size_t i, j, k, matches;
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
node = (QL_ast_node_t*) query->_from._base->_next;
|
node = (QL_ast_node_t*) query->_from._base->_next;
|
||||||
|
|
||||||
assert(node != 0);
|
assert(node != 0);
|
||||||
|
|
||||||
|
// enum all collections used in query
|
||||||
while (node != 0) {
|
while (node != 0) {
|
||||||
ranges = 0;
|
ranges = 0;
|
||||||
if (count++ == 0) {
|
if (count++ == 0) {
|
||||||
collectionName = ((QL_ast_node_t*) node->_lhs)->_value._stringValue;
|
collectionName = ((QL_ast_node_t*) node->_lhs)->_value._stringValue;
|
||||||
|
alias = ((QL_ast_node_t*) node->_rhs)->_value._stringValue;
|
||||||
ranges = QLOptimizeCondition(query->_where._base);
|
ranges = QLOptimizeCondition(query->_where._base);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
collectionName = ((QL_ast_node_t*) ((QL_ast_node_t*) node->_lhs)->_lhs)->_value._stringValue;
|
collectionName = ((QL_ast_node_t*) ((QL_ast_node_t*) node->_lhs)->_lhs)->_value._stringValue;
|
||||||
|
alias = ((QL_ast_node_t*) ((QL_ast_node_t*) node->_lhs)->_rhs)->_value._stringValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// accessType = TABLE_SCAN;
|
// accessType = TABLE_SCAN;
|
||||||
|
@ -1578,6 +1693,7 @@ return;
|
||||||
if (ranges) {
|
if (ranges) {
|
||||||
indexDefinitions = TRI_GetCollectionIndexes(query->_vocbase, collectionName);
|
indexDefinitions = TRI_GetCollectionIndexes(query->_vocbase, collectionName);
|
||||||
|
|
||||||
|
// enum all indexes
|
||||||
for (i = 0; i < indexDefinitions._length; i++) {
|
for (i = 0; i < indexDefinitions._length; i++) {
|
||||||
indexDefinition = (TRI_index_definition_t*) indexDefinitions._buffer[i];
|
indexDefinition = (TRI_index_definition_t*) indexDefinitions._buffer[i];
|
||||||
|
|
||||||
|
@ -1585,8 +1701,8 @@ return;
|
||||||
for (j = 0 ; j < indexDefinition->_fields._length; j++) {
|
for (j = 0 ; j < indexDefinition->_fields._length; j++) {
|
||||||
for (k = 0; k < ranges->_length; k++) {
|
for (k = 0; k < ranges->_length; k++) {
|
||||||
range = (QL_optimize_range_t*) ranges->_buffer[k];
|
range = (QL_optimize_range_t*) ranges->_buffer[k];
|
||||||
// check if collection is the same
|
// check if collection name matches
|
||||||
if (strcmp(range->_collection, collectionName) != 0) {
|
if (strcmp(range->_collection, alias) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1606,7 +1722,8 @@ return;
|
||||||
range->_minValue._doubleValue != range->_maxValue._doubleValue) {
|
range->_minValue._doubleValue != range->_maxValue._doubleValue) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (range->_valueType == RANGE_TYPE_STRING &&
|
if ((range->_valueType == RANGE_TYPE_STRING ||
|
||||||
|
range->_valueType == RANGE_TYPE_JSON) &&
|
||||||
strcmp(range->_minValue._stringValue, range->_maxValue._stringValue) != 0) {
|
strcmp(range->_minValue._stringValue, range->_maxValue._stringValue) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "QL/ast-query.h"
|
#include "QL/ast-query.h"
|
||||||
#include "QL/parser-context.h"
|
#include "QL/parser-context.h"
|
||||||
#include "QL/formatter.h"
|
#include "QL/formatter.h"
|
||||||
|
#include "QL/javascripter.h"
|
||||||
#include "VocBase/index.h"
|
#include "VocBase/index.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -98,12 +99,16 @@ QL_optimize_range_type_e;
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Range value types
|
/// @brief Range value types
|
||||||
///
|
///
|
||||||
/// Currently supported types are doubles (numbers) and strings
|
/// Currently supported types are collection attributes (fields), doubles
|
||||||
|
/// (numbers), strings, and JSON documents.
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RANGE_TYPE_DOUBLE = 0,
|
RANGE_TYPE_FIELD = 1,
|
||||||
RANGE_TYPE_STRING = 1
|
RANGE_TYPE_DOUBLE = 2,
|
||||||
|
RANGE_TYPE_STRING = 3,
|
||||||
|
RANGE_TYPE_JSON = 4
|
||||||
|
|
||||||
}
|
}
|
||||||
QL_optimize_range_value_type_e;
|
QL_optimize_range_value_type_e;
|
||||||
|
|
||||||
|
@ -146,6 +151,10 @@ typedef struct QL_optimize_range_s {
|
||||||
double _doubleValue;
|
double _doubleValue;
|
||||||
char* _stringValue;
|
char* _stringValue;
|
||||||
} _maxValue;
|
} _maxValue;
|
||||||
|
struct {
|
||||||
|
char* _collection;
|
||||||
|
char *_field;
|
||||||
|
} _refValue;
|
||||||
uint64_t _hash;
|
uint64_t _hash;
|
||||||
QL_optimize_range_type_e _minStatus;
|
QL_optimize_range_type_e _minStatus;
|
||||||
QL_optimize_range_type_e _maxStatus;
|
QL_optimize_range_type_e _maxStatus;
|
||||||
|
|
16
README.md
16
README.md
|
@ -7,12 +7,8 @@ effort to operate for the administrator.
|
||||||
|
|
||||||
## Compilation
|
## Compilation
|
||||||
|
|
||||||
1. Install Dependencies: V8, boost, libev
|
Please check the <a href="https://github.com/triAGENS/AvocadoDB/wiki">wiki</a>
|
||||||
2. make setup
|
for installation and compilation instructions:
|
||||||
3. ./configure --with-boost=PATH_TO_BOOST --with-libev=PATH_TO_LIBEV --with-v8=PATH_TO_V8
|
|
||||||
4. make
|
|
||||||
5. create a directory `/var/lib/avocado` where you are allowed to read and write
|
|
||||||
6. "./avocado /var/lib/avocado" to start a REST server or "./avocado /var/lib/avocado --shell" for debugging
|
|
||||||
|
|
||||||
### Mac OS X Hints
|
### Mac OS X Hints
|
||||||
|
|
||||||
|
@ -28,3 +24,11 @@ This will install AvocadoDB and all dependencies.
|
||||||
avocado> db.examples.count();
|
avocado> db.examples.count();
|
||||||
avocado> db.examples.save({ Hallo: "World" });
|
avocado> db.examples.save({ Hallo: "World" });
|
||||||
avocado> db.examples.select();
|
avocado> db.examples.select();
|
||||||
|
|
||||||
|
## Caveat
|
||||||
|
|
||||||
|
Please note that this is a very early version if AvocadoDB. There will be
|
||||||
|
bugs and we'd realy appreciate it if you
|
||||||
|
<a href="https://github.com/triAGENS/AvocadoDB/issues">report</a> them:
|
||||||
|
|
||||||
|
https://github.com/triAGENS/AvocadoDB/issues
|
||||||
|
|
|
@ -142,6 +142,10 @@ namespace triagens {
|
||||||
|
|
||||||
|
|
||||||
void ShutdownRest () {
|
void ShutdownRest () {
|
||||||
|
#ifdef TRI_HAVE_POSIX_THREADS
|
||||||
|
opensslCleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
TRI_ShutdownUrl();
|
TRI_ShutdownUrl();
|
||||||
|
|
||||||
TRIAGENS_BASICS_SHUTDOWN;
|
TRIAGENS_BASICS_SHUTDOWN;
|
||||||
|
|
|
@ -408,7 +408,6 @@ void AvocadoServer::buildApplicationServer () {
|
||||||
|
|
||||||
if (! ok) {
|
if (! ok) {
|
||||||
LOGGER_FATAL << "cannot create action directory '" << pathString << "': " << TRI_last_error();
|
LOGGER_FATAL << "cannot create action directory '" << pathString << "': " << TRI_last_error();
|
||||||
cerr << "cannot create action directory '" << pathString << "': " << TRI_last_error() << "\n";
|
|
||||||
LOGGER_INFO << "please use the '--database.directory' option";
|
LOGGER_INFO << "please use the '--database.directory' option";
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
namespace triagens {
|
namespace triagens {
|
||||||
namespace basics {
|
namespace basics {
|
||||||
class StringBuffer;
|
struct StringBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace rest {
|
namespace rest {
|
||||||
|
|
|
@ -413,7 +413,7 @@ static TRI_fluent_query_t* ExtractFluentQuery (v8::Handle<v8::Object> queryObjec
|
||||||
TRI_vocbase_col_t const* collection = LoadCollection(queryObject, err);
|
TRI_vocbase_col_t const* collection = LoadCollection(queryObject, err);
|
||||||
|
|
||||||
if (collection == 0) {
|
if (collection == 0) {
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRI_fluent_query_t* query = TRI_CreateCollectionQuery(collection);
|
TRI_fluent_query_t* query = TRI_CreateCollectionQuery(collection);
|
||||||
|
|
|
@ -1104,7 +1104,7 @@ static TRI_json_t* JsonHashIndex (TRI_index_t* idx, TRI_doc_collection_t* collec
|
||||||
TRI_json_t* json;
|
TRI_json_t* json;
|
||||||
const TRI_shape_path_t* path;
|
const TRI_shape_path_t* path;
|
||||||
TRI_hash_index_t* hashIndex;
|
TRI_hash_index_t* hashIndex;
|
||||||
char** fieldList;
|
char const** fieldList;
|
||||||
char* fieldCounter;
|
char* fieldCounter;
|
||||||
|
|
||||||
// ..........................................................................
|
// ..........................................................................
|
||||||
|
|
|
@ -321,10 +321,8 @@ static bool ToJavaScriptHashDocument (TRI_qry_select_t* s,
|
||||||
TRI_rc_result_t* result,
|
TRI_rc_result_t* result,
|
||||||
void* storage) {
|
void* storage) {
|
||||||
|
|
||||||
TRI_doc_mptr_t masterPointer;
|
|
||||||
TRI_doc_mptr_t* document;
|
TRI_doc_mptr_t* document;
|
||||||
TRI_doc_collection_t* collection;
|
TRI_doc_collection_t* collection;
|
||||||
TRI_sim_collection_t* simCollection;
|
|
||||||
|
|
||||||
collection = result->_context->_primary;
|
collection = result->_context->_primary;
|
||||||
|
|
||||||
|
@ -354,7 +352,6 @@ static bool ToJavaScriptHashDocument (TRI_qry_select_t* s,
|
||||||
static TRI_rc_result_t* NextHashCollectionCursor (TRI_rc_cursor_t* c) {
|
static TRI_rc_result_t* NextHashCollectionCursor (TRI_rc_cursor_t* c) {
|
||||||
collection_cursor_t* cursor;
|
collection_cursor_t* cursor;
|
||||||
TRI_doc_collection_t* collection;
|
TRI_doc_collection_t* collection;
|
||||||
TRI_sim_collection_t* simCollection;
|
|
||||||
|
|
||||||
cursor = (collection_cursor_t*) c;
|
cursor = (collection_cursor_t*) c;
|
||||||
collection = cursor->base._context->_primary;
|
collection = cursor->base._context->_primary;
|
||||||
|
|
|
@ -1667,7 +1667,7 @@ static bool CreateImmediateIndexes (TRI_sim_collection_t* collection,
|
||||||
|
|
||||||
ok = idx->insert(idx, header);
|
ok = idx->insert(idx, header);
|
||||||
|
|
||||||
i < n ? idx : NULL;
|
// i < n ? idx : NULL;
|
||||||
if (! ok) {
|
if (! ok) {
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5277,8 +5277,21 @@ if test x$GCC == xyes; then
|
||||||
WALL="${WALL} -Werror"
|
WALL="${WALL} -Werror"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test x$tr_DARWIN == xyes; then
|
||||||
|
WALL="${WALL} -Wno-deprecated-declarations"
|
||||||
|
fi
|
||||||
|
|
||||||
WALLC="${WALL} -Wshadow -Wstrict-prototypes -Wdeclaration-after-statement"
|
WALLC="${WALL} -Wshadow -Wstrict-prototypes -Wdeclaration-after-statement"
|
||||||
WALLCXX="${WALL} -Wstrict-null-sentinel -Woverloaded-virtual -Wno-variadic-macros"
|
WALLCXX="${WALL} -Woverloaded-virtual -Wno-variadic-macros"
|
||||||
|
|
||||||
|
case $CXX in
|
||||||
|
*clang++*)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
WALLCXX="${WALLCXX} -Wstrict-null-sentinel"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
if test x$tr_WEFFCXX == xyes; then
|
if test x$tr_WEFFCXX == xyes; then
|
||||||
WALLCXX="${WALLCXX} -Weffc++"
|
WALLCXX="${WALLCXX} -Weffc++"
|
||||||
|
|
|
@ -0,0 +1,520 @@
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief tests for "aql.js"
|
||||||
|
///
|
||||||
|
/// @file
|
||||||
|
///
|
||||||
|
/// DISCLAIMER
|
||||||
|
///
|
||||||
|
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
|
||||||
|
///
|
||||||
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
/// you may not use this file except in compliance with the License.
|
||||||
|
/// You may obtain a copy of the License at
|
||||||
|
///
|
||||||
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
///
|
||||||
|
/// Unless required by applicable law or agreed to in writing, software
|
||||||
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
/// See the License for the specific language governing permissions and
|
||||||
|
/// limitations under the License.
|
||||||
|
///
|
||||||
|
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
||||||
|
///
|
||||||
|
/// @author Jan Steemann
|
||||||
|
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test suite
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function aqlTestSuite () {
|
||||||
|
var collection = null;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief set up
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function setUp () {
|
||||||
|
this.collection = db.UnitTestsNumbersList;
|
||||||
|
|
||||||
|
if (this.collection.count() == 0) {
|
||||||
|
for (var i = 0; i <= 20; i++) {
|
||||||
|
for (var j = 0; j <= i; j++) {
|
||||||
|
this.collection.save({ value1: i, value2: j, value3: i * j});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief tear down
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function tearDown () {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief execute a given query
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function executeQuery (query) {
|
||||||
|
var aQuery = AQL_PREPARE(db, query);
|
||||||
|
if (aQuery) {
|
||||||
|
return aQuery.execute();
|
||||||
|
}
|
||||||
|
return aQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief execute a given query and return the results as an array
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function getQueryResults (query) {
|
||||||
|
var aCursor = this.executeQuery(query);
|
||||||
|
if (aCursor) {
|
||||||
|
var results = [ ];
|
||||||
|
while (aCursor.hasNext()) {
|
||||||
|
results.push(aCursor.next());
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
return aCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief assemble a query string from the parameters given
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function assembleQuery (value1, value2, limit) {
|
||||||
|
var query = 'SELECT { } FROM ' + this.collection._name + ' c WHERE ';
|
||||||
|
var cond = '';
|
||||||
|
|
||||||
|
if (value1 !== undefined) {
|
||||||
|
cond += value1;
|
||||||
|
}
|
||||||
|
if (value2 !== undefined) {
|
||||||
|
if (cond != '') {
|
||||||
|
cond += ' && ';
|
||||||
|
}
|
||||||
|
cond += value2;
|
||||||
|
}
|
||||||
|
query += cond;
|
||||||
|
|
||||||
|
if (limit !== undefined) {
|
||||||
|
query += ' LIMIT ' + limit;
|
||||||
|
}
|
||||||
|
print("Q: " + query);
|
||||||
|
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief check the length of a query result set
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function checkLength (expected, value1, value2, limit) {
|
||||||
|
var query = this.assembleQuery(value1, value2, limit);
|
||||||
|
var result = this.getQueryResults(query);
|
||||||
|
assertTrue(result instanceof Array);
|
||||||
|
var actual = result.length;
|
||||||
|
assertEqual(expected, actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for a simple eq condition matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testResultLengthsEqIndividual1 () {
|
||||||
|
for (i = 0; i <= 20; i++) {
|
||||||
|
this.checkLength(i + 1, 'c.value1 == ' + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for a simple eq condition matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testResultLengthsEqIndividual2 () {
|
||||||
|
for (i = 0; i <= 20; i++) {
|
||||||
|
this.checkLength(21 - i, undefined, 'c.value2 == ' + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for combined eq conditions match
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testResultLengthsEqCombined () {
|
||||||
|
for (i = 0; i <= 20; i++) {
|
||||||
|
for (j = 0; j <= i; j++) {
|
||||||
|
this.checkLength(1, 'c.value1 == ' + i, 'c.value2 == ' + j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for range queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testResultLengthsBetweenIndividual1 () {
|
||||||
|
for (i = 0; i <= 20; i++) {
|
||||||
|
this.checkLength(i + 1, 'c.value1 >= ' + i, 'c.value1 <= ' + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for (senseless) range queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testResultLengthsBetweenIndividual2 () {
|
||||||
|
for (i = 0; i <= 20; i++) {
|
||||||
|
this.checkLength(0, 'c.value1 > ' + i, 'c.value1 < ' + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for single-range queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testResultLengthsLessIndividual1 () {
|
||||||
|
var expected = 0;
|
||||||
|
for (i = 0; i <= 20; i++) {
|
||||||
|
for (var j = 0; j <= i; j++, expected++);
|
||||||
|
this.checkLength(expected, 'c.value1 <= ' + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for range queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testResultLengthsLessIndividual2 () {
|
||||||
|
var expected = 0;
|
||||||
|
for (i = 0; i <= 20; i++) {
|
||||||
|
expected += 21 - i;
|
||||||
|
this.checkLength(expected, 'c.value2 <= ' + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for out-of-range queries is 0
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testNonResultsIndividual1 () {
|
||||||
|
this.checkLength(0, 'c.value1 < 0');
|
||||||
|
this.checkLength(0, 'c.value1 <= -0.01');
|
||||||
|
this.checkLength(0, 'c.value1 < -0.1');
|
||||||
|
this.checkLength(0, 'c.value1 <= -0.1');
|
||||||
|
this.checkLength(0, 'c.value1 <= -1');
|
||||||
|
this.checkLength(0, 'c.value1 <= -1.0');
|
||||||
|
this.checkLength(0, 'c.value1 < -10');
|
||||||
|
this.checkLength(0, 'c.value1 <= -100');
|
||||||
|
|
||||||
|
this.checkLength(0, 'c.value1 == 21');
|
||||||
|
this.checkLength(0, 'c.value1 == 110');
|
||||||
|
this.checkLength(0, 'c.value1 == 20.001');
|
||||||
|
this.checkLength(0, 'c.value1 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 >= 20.01');
|
||||||
|
this.checkLength(0, 'c.value1 > 100');
|
||||||
|
this.checkLength(0, 'c.value1 >= 100');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for out-of-range queries is 0
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testNonResultsIndividual2 () {
|
||||||
|
this.checkLength(0, 'c.value2 < 0');
|
||||||
|
this.checkLength(0, 'c.value2 <= -0.01');
|
||||||
|
this.checkLength(0, 'c.value2 < -0.1');
|
||||||
|
this.checkLength(0, 'c.value2 <= -0.1');
|
||||||
|
this.checkLength(0, 'c.value2 <= -1');
|
||||||
|
this.checkLength(0, 'c.value2 <= -1.0');
|
||||||
|
this.checkLength(0, 'c.value2 < -10');
|
||||||
|
this.checkLength(0, 'c.value2 <= -100');
|
||||||
|
|
||||||
|
this.checkLength(0, 'c.value2 == 21');
|
||||||
|
this.checkLength(0, 'c.value2 === 21');
|
||||||
|
this.checkLength(0, 'c.value2 == 110');
|
||||||
|
this.checkLength(0, 'c.value2 == 20.001');
|
||||||
|
this.checkLength(0, 'c.value2 > 20');
|
||||||
|
this.checkLength(0, 'c.value2 >= 20.01');
|
||||||
|
this.checkLength(0, 'c.value2 > 100');
|
||||||
|
this.checkLength(0, 'c.value2 >= 100');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for out-of-range queries is 0
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testNonResultsCombined () {
|
||||||
|
this.checkLength(0, 'c.value1 > 0', 'c.value2 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 >= 0', 'c.value2 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 < 0', 'c.value2 > 0');
|
||||||
|
this.checkLength(0, 'c.value1 < 0', 'c.value2 >= 0');
|
||||||
|
|
||||||
|
this.checkLength(0, 'c.value1 == 21', 'c.value2 == 0');
|
||||||
|
this.checkLength(0, 'c.value1 == 21', 'c.value2 == 1');
|
||||||
|
this.checkLength(0, 'c.value1 == 21', 'c.value2 >= 0');
|
||||||
|
this.checkLength(0, 'c.value1 == 1', 'c.value2 == 21');
|
||||||
|
this.checkLength(0, 'c.value1 == 0', 'c.value2 == 21');
|
||||||
|
this.checkLength(0, 'c.value1 >= 0', 'c.value2 == 21');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for (illogical) ranges is 0
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testNonResultsIllogical () {
|
||||||
|
this.checkLength(0, 'c.value1 > 0', 'c.value1 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 >= 0', 'c.value1 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 == 0', 'c.value1 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 === 0', 'c.value1 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 !== 0', 'c.value1 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 != 0', 'c.value1 > 20');
|
||||||
|
this.checkLength(0, 'c.value1 > 20', 'c.value1 > 0');
|
||||||
|
this.checkLength(0, 'c.value1 > 20', 'c.value1 >= 0');
|
||||||
|
this.checkLength(0, 'c.value1 >= 21', 'c.value1 > 0');
|
||||||
|
this.checkLength(0, 'c.value1 >= 21', 'c.value1 >= 0');
|
||||||
|
this.checkLength(0, 'c.value1 >= 21', 'c.value1 == 0');
|
||||||
|
this.checkLength(0, 'c.value1 >= 21', 'c.value1 === 0');
|
||||||
|
this.checkLength(0, 'c.value1 >= 21', 'c.value1 !== 0');
|
||||||
|
this.checkLength(0, 'c.value1 >= 21', 'c.value1 != 0');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for limit queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testLimitNonOffset1 () {
|
||||||
|
this.checkLength(0, 'c.value1 == 0', undefined, '0');
|
||||||
|
this.checkLength(0, 'c.value1 == 0', undefined, '0,0');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '1');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '2');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '3');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '0,1');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '0,2');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '0,3');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '0,-1');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '0,-2');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '0,-3');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '-1');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '-2');
|
||||||
|
this.checkLength(1, 'c.value1 == 0', undefined, '-3');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for limit queries w/ offset matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testLimitOffset1 () {
|
||||||
|
this.checkLength(0, 'c.value1 == 0', undefined, '1,1');
|
||||||
|
this.checkLength(0, 'c.value1 == 0', undefined, '1,-1');
|
||||||
|
this.checkLength(0, 'c.value1 == 0', undefined, '1,0');
|
||||||
|
|
||||||
|
this.checkLength(0, 'c.value1 == 0', undefined, '1,2');
|
||||||
|
this.checkLength(0, 'c.value1 == 0', undefined, '1,-2');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for limit queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testLimitNonOffset2 () {
|
||||||
|
this.checkLength(0, 'c.value1 == 3', undefined, '0');
|
||||||
|
this.checkLength(0, 'c.value1 == 3', undefined, '0,0');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 3', undefined, '1');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '2');
|
||||||
|
this.checkLength(3, 'c.value1 == 3', undefined, '3');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 3', undefined, '0,1');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '0,2');
|
||||||
|
this.checkLength(3, 'c.value1 == 3', undefined, '0,3');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 3', undefined, '0,-1');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '0,-2');
|
||||||
|
this.checkLength(3, 'c.value1 == 3', undefined, '0,-3');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 3', undefined, '-1');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '-2');
|
||||||
|
this.checkLength(3, 'c.value1 == 3', undefined, '-3');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for limit queries w/ offset matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testLimitOffset2 () {
|
||||||
|
this.checkLength(1, 'c.value1 == 3', undefined, '1,1');
|
||||||
|
this.checkLength(1, 'c.value1 == 3', undefined, '1,-1');
|
||||||
|
this.checkLength(0, 'c.value1 == 3', undefined, '1,0');
|
||||||
|
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '1,2');
|
||||||
|
this.checkLength(3, 'c.value1 == 3', undefined, '1,3');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '1,-2');
|
||||||
|
this.checkLength(3, 'c.value1 == 3', undefined, '1,-3');
|
||||||
|
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '2,2');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '2,3');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '2,-2');
|
||||||
|
this.checkLength(2, 'c.value1 == 3', undefined, '2,-3');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for limit queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testLimitNonOffset3 () {
|
||||||
|
this.checkLength(0, 'c.value1 == 10', undefined, '0');
|
||||||
|
this.checkLength(10, 'c.value1 == 10', undefined, '10');
|
||||||
|
this.checkLength(10, 'c.value1 == 10', undefined, '0,10');
|
||||||
|
this.checkLength(11, 'c.value1 == 10', undefined, '0,11');
|
||||||
|
this.checkLength(11, 'c.value1 == 10', undefined, '0,12');
|
||||||
|
this.checkLength(11, 'c.value1 == 10', undefined, '0,100');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for limit queries w/ offset matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testLimitOffset3 () {
|
||||||
|
this.checkLength(10, 'c.value1 == 10', undefined, '1,10');
|
||||||
|
this.checkLength(10, 'c.value1 == 10', undefined, '1,100');
|
||||||
|
this.checkLength(10, 'c.value1 == 10', undefined, '1,-10');
|
||||||
|
this.checkLength(10, 'c.value1 == 10', undefined, '1,-100');
|
||||||
|
this.checkLength(9, 'c.value1 == 10', undefined, '2,10');
|
||||||
|
this.checkLength(9, 'c.value1 == 10', undefined, '2,11');
|
||||||
|
|
||||||
|
this.checkLength(1, 'c.value1 == 10', undefined, '10,10');
|
||||||
|
this.checkLength(1, 'c.value1 == 10', undefined, '10,-10');
|
||||||
|
this.checkLength(0, 'c.value1 == 10', undefined, '100,1');
|
||||||
|
this.checkLength(0, 'c.value1 == 10', undefined, '100,10');
|
||||||
|
this.checkLength(0, 'c.value1 == 10', undefined, '100,100');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief test if the number of results for some prefab queries matches
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
function testMixedQueries () {
|
||||||
|
this.checkLength(175,'c.value1 != 0', 'c.value2 < 11');
|
||||||
|
this.checkLength(0,'c.value1 < 0', 'c.value2 > 14');
|
||||||
|
this.checkLength(0,'c.value1 === 0', 'c.value2 === 18');
|
||||||
|
this.checkLength(0,'c.value1 < 0', 'c.value2 >= 19');
|
||||||
|
this.checkLength(1,'c.value1 == 0', 'c.value2 != 2');
|
||||||
|
this.checkLength(0,'c.value1 < 0', 'c.value2 == 3');
|
||||||
|
this.checkLength(0,'c.value1 <= 0', 'c.value2 > 4');
|
||||||
|
this.checkLength(111,'c.value1 >= 0', 'c.value2 < 6');
|
||||||
|
this.checkLength(7,'c.value1 > 10', 'c.value2 == 14');
|
||||||
|
this.checkLength(7,'c.value1 != 10', 'c.value2 === 14');
|
||||||
|
this.checkLength(11,'c.value1 == 10', 'c.value2 != 19');
|
||||||
|
this.checkLength(3,'c.value1 == 10', 'c.value2 <= 2');
|
||||||
|
this.checkLength(3,'c.value1 < 10', 'c.value2 === 7');
|
||||||
|
this.checkLength(12,'c.value1 != 10', 'c.value2 == 8');
|
||||||
|
this.checkLength(50,'c.value1 >= 11', 'c.value2 < 5');
|
||||||
|
this.checkLength(6,'c.value1 === 11', 'c.value2 < 6');
|
||||||
|
this.checkLength(10,'c.value1 != 12', 'c.value2 === 10');
|
||||||
|
this.checkLength(132,'c.value1 > 12', 'c.value2 != 12');
|
||||||
|
this.checkLength(13,'c.value1 === 12', 'c.value2 != 14');
|
||||||
|
this.checkLength(0,'c.value1 === 12', 'c.value2 == 15');
|
||||||
|
this.checkLength(0,'c.value1 <= 12', 'c.value2 > 18');
|
||||||
|
this.checkLength(204,'c.value1 != 12', 'c.value2 != 6');
|
||||||
|
this.checkLength(91,'c.value1 > 13', 'c.value2 <= 12');
|
||||||
|
this.checkLength(0,'c.value1 == 13', 'c.value2 >= 17');
|
||||||
|
this.checkLength(39,'c.value1 <= 13', 'c.value2 < 3');
|
||||||
|
this.checkLength(21,'c.value1 < 13', 'c.value2 >= 7');
|
||||||
|
this.checkLength(15,'c.value1 == 14', 'c.value2 != 17');
|
||||||
|
this.checkLength(3,'c.value1 > 14', 'c.value2 == 18');
|
||||||
|
this.checkLength(1,'c.value1 != 14', 'c.value2 >= 20');
|
||||||
|
this.checkLength(119,'c.value1 >= 14', 'c.value2 != 6');
|
||||||
|
this.checkLength(15,'c.value1 == 15', 'c.value2 != 3');
|
||||||
|
this.checkLength(45,'c.value1 <= 15', 'c.value2 > 6');
|
||||||
|
this.checkLength(7,'c.value1 == 15', 'c.value2 < 7');
|
||||||
|
this.checkLength(99,'c.value1 < 15', 'c.value2 <= 8');
|
||||||
|
this.checkLength(54,'c.value1 >= 15', 'c.value2 <= 8');
|
||||||
|
this.checkLength(1,'c.value1 === 16', 'c.value2 == 3');
|
||||||
|
this.checkLength(16,'c.value1 === 16', 'c.value2 != 6');
|
||||||
|
this.checkLength(152,'c.value1 < 17', 'c.value2 != 16');
|
||||||
|
this.checkLength(6,'c.value1 >= 17', 'c.value2 > 17');
|
||||||
|
this.checkLength(16,'c.value1 <= 17', 'c.value2 === 2');
|
||||||
|
this.checkLength(33,'c.value1 < 17', 'c.value2 < 2');
|
||||||
|
this.checkLength(9,'c.value1 <= 18', 'c.value2 === 10');
|
||||||
|
this.checkLength(205,'c.value1 != 18', 'c.value2 != 13');
|
||||||
|
this.checkLength(171,'c.value1 < 18', 'c.value2 != 20');
|
||||||
|
this.checkLength(0,'c.value1 === 18', 'c.value2 > 20');
|
||||||
|
this.checkLength(161,'c.value1 < 18', 'c.value2 != 8');
|
||||||
|
this.checkLength(2,'c.value1 > 18', 'c.value2 === 8');
|
||||||
|
this.checkLength(1,'c.value1 == 19', 'c.value2 === 15');
|
||||||
|
this.checkLength(2,'c.value1 >= 19', 'c.value2 == 18');
|
||||||
|
this.checkLength(178,'c.value1 < 19', 'c.value2 != 7');
|
||||||
|
this.checkLength(7,'c.value1 > 1', 'c.value2 == 14');
|
||||||
|
this.checkLength(213,'c.value1 > 1', 'c.value2 <= 15');
|
||||||
|
this.checkLength(1,'c.value1 > 1', 'c.value2 == 20');
|
||||||
|
this.checkLength(0,'c.value1 == 1', 'c.value2 === 5');
|
||||||
|
this.checkLength(55,'c.value1 <= 20', 'c.value2 > 10');
|
||||||
|
this.checkLength(5,'c.value1 >= 20', 'c.value2 >= 16');
|
||||||
|
this.checkLength(0,'c.value1 != 20', 'c.value2 === 20');
|
||||||
|
this.checkLength(9,'c.value1 == 20', 'c.value2 <= 8');
|
||||||
|
this.checkLength(10,'c.value1 >= 20', 'c.value2 <= 9');
|
||||||
|
this.checkLength(3,'c.value1 > 2', 'c.value2 == 18');
|
||||||
|
this.checkLength(10,'c.value1 <= 3', 'c.value2 <= 15');
|
||||||
|
this.checkLength(6,'c.value1 < 3', 'c.value2 != 4');
|
||||||
|
this.checkLength(17,'c.value1 != 3', 'c.value2 == 4');
|
||||||
|
this.checkLength(208,'c.value1 > 3', 'c.value2 != 8');
|
||||||
|
this.checkLength(188,'c.value1 > 4', 'c.value2 <= 13');
|
||||||
|
this.checkLength(0,'c.value1 < 4', 'c.value2 === 4');
|
||||||
|
this.checkLength(101,'c.value1 >= 4', 'c.value2 <= 5');
|
||||||
|
this.checkLength(0,'c.value1 == 4', 'c.value2 > 7');
|
||||||
|
this.checkLength(205,'c.value1 != 5', 'c.value2 >= 1');
|
||||||
|
this.checkLength(150,'c.value1 >= 5', 'c.value2 < 10');
|
||||||
|
this.checkLength(6,'c.value1 === 5', 'c.value2 < 14');
|
||||||
|
this.checkLength(4,'c.value1 >= 5', 'c.value2 === 17');
|
||||||
|
this.checkLength(4,'c.value1 > 5', 'c.value2 === 17');
|
||||||
|
this.checkLength(0,'c.value1 <= 5', 'c.value2 == 18');
|
||||||
|
this.checkLength(1,'c.value1 === 5', 'c.value2 == 2');
|
||||||
|
this.checkLength(215,'c.value1 >= 5', 'c.value2 != 20');
|
||||||
|
this.checkLength(15,'c.value1 > 5', 'c.value2 == 3');
|
||||||
|
this.checkLength(202,'c.value1 >= 6', 'c.value2 != 13');
|
||||||
|
this.checkLength(3,'c.value1 >= 6', 'c.value2 >= 19');
|
||||||
|
this.checkLength(150,'c.value1 >= 6', 'c.value2 > 3');
|
||||||
|
this.checkLength(7,'c.value1 == 7', 'c.value2 > 0');
|
||||||
|
this.checkLength(55,'c.value1 >= 7', 'c.value2 >= 11');
|
||||||
|
this.checkLength(55,'c.value1 != 7', 'c.value2 >= 11');
|
||||||
|
this.checkLength(0,'c.value1 <= 7', 'c.value2 == 16');
|
||||||
|
this.checkLength(0,'c.value1 == 7', 'c.value2 == 20');
|
||||||
|
this.checkLength(203,'c.value1 >= 7', 'c.value2 <= 20');
|
||||||
|
this.checkLength(5,'c.value1 <= 7', 'c.value2 === 3');
|
||||||
|
this.checkLength(14,'c.value1 >= 7', 'c.value2 === 5');
|
||||||
|
this.checkLength(36,'c.value1 <= 7', 'c.value2 <= 7');
|
||||||
|
this.checkLength(174,'c.value1 > 8', 'c.value2 != 1');
|
||||||
|
this.checkLength(9,'c.value1 === 8', 'c.value2 != 10');
|
||||||
|
this.checkLength(167,'c.value1 != 8', 'c.value2 < 11');
|
||||||
|
this.checkLength(9,'c.value1 === 8', 'c.value2 < 14');
|
||||||
|
this.checkLength(0,'c.value1 <= 8', 'c.value2 == 20');
|
||||||
|
this.checkLength(0,'c.value1 == 8', 'c.value2 >= 9');
|
||||||
|
this.checkLength(4,'c.value1 >= 9', 'c.value2 === 17');
|
||||||
|
this.checkLength(55,'c.value1 <= 9', 'c.value2 <= 18');
|
||||||
|
this.checkLength(48,'c.value1 >= 9', 'c.value2 <= 3');
|
||||||
|
this.checkLength(12,'c.value1 >= 9', 'c.value2 == 5');
|
||||||
|
this.checkLength(2,'c.value1 <= 9', 'c.value2 == 8');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief executes the test suite
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
jsUnity.run(aqlTestSuite);
|
||||||
|
|
||||||
|
// Local Variables:
|
||||||
|
// mode: outline-minor
|
||||||
|
// outline-regexp: "^\\(/// @brief\\|/// @addtogroup\\|// --SECTION--\\|/// @page\\|/// @}\\)"
|
||||||
|
// End:
|
|
@ -87,8 +87,21 @@ if test x$GCC == xyes; then
|
||||||
WALL="${WALL} -Werror"
|
WALL="${WALL} -Werror"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test x$tr_DARWIN == xyes; then
|
||||||
|
WALL="${WALL} -Wno-deprecated-declarations"
|
||||||
|
fi
|
||||||
|
|
||||||
WALLC="${WALL} -Wshadow -Wstrict-prototypes -Wdeclaration-after-statement"
|
WALLC="${WALL} -Wshadow -Wstrict-prototypes -Wdeclaration-after-statement"
|
||||||
WALLCXX="${WALL} -Wstrict-null-sentinel -Woverloaded-virtual -Wno-variadic-macros"
|
WALLCXX="${WALL} -Woverloaded-virtual -Wno-variadic-macros"
|
||||||
|
|
||||||
|
case $CXX in
|
||||||
|
*clang++*)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
WALLCXX="${WALLCXX} -Wstrict-null-sentinel"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
if test x$tr_WEFFCXX == xyes; then
|
if test x$tr_WEFFCXX == xyes; then
|
||||||
WALLCXX="${WALLCXX} -Weffc++"
|
WALLCXX="${WALLCXX} -Weffc++"
|
||||||
|
|
Loading…
Reference in New Issue