1
0
Fork 0

removed AQL_PENG

This commit is contained in:
Jan Steemann 2014-07-31 12:30:16 +02:00
parent bee98cf420
commit 1ff3d44e88
7 changed files with 80 additions and 100 deletions

View File

@ -26,6 +26,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include "Aql/ExecutionBlock.h" #include "Aql/ExecutionBlock.h"
#include "Utils/Exception.h"
using namespace triagens::basics; using namespace triagens::basics;
using namespace triagens::arango; using namespace triagens::arango;
@ -82,8 +83,7 @@ ExecutionBlock* ExecutionBlock::instanciatePlan (ExecutionPlan const* ep) {
break; break;
} }
default: { default: {
TRI_ASSERT(false); THROW_ARANGO_EXCEPTION(TRI_ERROR_NOT_IMPLEMENTED);
break;
} }
} }
vector<ExecutionPlan*> deps = ep->getDependencies(); vector<ExecutionPlan*> deps = ep->getDependencies();

View File

@ -29,6 +29,7 @@
#include "Aql/Parser.h" #include "Aql/Parser.h"
#include "Aql/AstNode.h" #include "Aql/AstNode.h"
#include "Aql/QueryResult.h"
using namespace triagens::aql; using namespace triagens::aql;
@ -107,7 +108,7 @@ bool Parser::configureWriteQuery (QueryType type,
/// @brief parse the query /// @brief parse the query
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ParseResult Parser::parse () { QueryResult Parser::parse () {
// start main scope // start main scope
auto scopes = _ast->scopes(); auto scopes = _ast->scopes();
scopes->start(AQL_SCOPE_MAIN); scopes->start(AQL_SCOPE_MAIN);
@ -134,7 +135,7 @@ ParseResult Parser::parse () {
TRI_ASSERT(scopes->numActive() == 0); TRI_ASSERT(scopes->numActive() == 0);
ParseResult result; QueryResult result;
result.collectionNames = _ast->collectionNames(); result.collectionNames = _ast->collectionNames();
result.bindParameters = _ast->bindParameters(); result.bindParameters = _ast->bindParameters();
result.json = _ast->toJson(TRI_UNKNOWN_MEM_ZONE); result.json = _ast->toJson(TRI_UNKNOWN_MEM_ZONE);

View File

@ -43,6 +43,7 @@ namespace triagens {
struct AstNode; struct AstNode;
class Query; class Query;
struct QueryResult;
class Parser; class Parser;
} }
} }
@ -204,7 +205,7 @@ namespace triagens {
/// @brief parse the query /// @brief parse the query
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ParseResult parse (); QueryResult parse ();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief register a parse error, position is specified as line / column /// @brief register a parse error, position is specified as line / column

View File

@ -28,7 +28,9 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include "Aql/Query.h" #include "Aql/Query.h"
#include "Aql/ExecutionBlock.h"
#include "Aql/Parser.h" #include "Aql/Parser.h"
#include "Aql/PlanGenerator.h"
#include "Aql/V8Executor.h" #include "Aql/V8Executor.h"
#include "BasicsC/json.h" #include "BasicsC/json.h"
#include "BasicsC/tri-strings.h" #include "BasicsC/tri-strings.h"
@ -163,23 +165,63 @@ void Query::registerError (int code,
/// @brief execute an AQL query - TODO: implement and determine return type /// @brief execute an AQL query - TODO: implement and determine return type
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ParseResult Query::execute () { QueryResult Query::execute () {
try { try {
Parser parser(this); Parser parser(this);
parser.parse(); parser.parse();
parser.ast()->injectBindParameters(_bindParameters); parser.ast()->injectBindParameters(_bindParameters);
parser.ast()->optimize(); parser.ast()->optimize();
ParseResult result(TRI_ERROR_NO_ERROR); PlanGenerator generator;
result.json = parser.ast()->toJson(TRI_UNKNOWN_MEM_ZONE); auto plan = generator.fromAst(parser.ast());
try {
auto exec = ExecutionBlock::instanciatePlan(plan);
try {
exec->staticAnalysis();
exec->initialize();
exec->execute();
shared_ptr<AqlItem> value;
while (nullptr != (value = exec->getOne())) {
std::cout << value->getValue(0, 0)->toString() << std::endl;
value.reset();
}
exec->shutdown();
delete exec;
}
catch (...) {
delete exec;
delete plan;
// TODO: convert exception code
return QueryResult(TRI_ERROR_INTERNAL);
}
}
catch (triagens::arango::Exception const& ex) {
delete plan;
return QueryResult(ex.code(), ex.message());
}
catch (...) {
delete plan;
// TODO: convert exception code
return QueryResult(TRI_ERROR_INTERNAL);
}
delete plan;
QueryResult result(TRI_ERROR_NO_ERROR);
// result.json = parser.ast()->toJson(TRI_UNKNOWN_MEM_ZONE);
return result; return result;
} }
catch (triagens::arango::Exception const& ex) { catch (triagens::arango::Exception const& ex) {
return ParseResult(ex.code(), ex.message()); return QueryResult(ex.code(), ex.message());
} }
catch (...) { catch (...) {
return ParseResult(TRI_ERROR_OUT_OF_MEMORY, TRI_errno_string(TRI_ERROR_OUT_OF_MEMORY)); return QueryResult(TRI_ERROR_OUT_OF_MEMORY, TRI_errno_string(TRI_ERROR_OUT_OF_MEMORY));
} }
} }
@ -187,16 +229,16 @@ ParseResult Query::execute () {
/// @brief parse an AQL query /// @brief parse an AQL query
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ParseResult Query::parse () { QueryResult Query::parse () {
try { try {
Parser parser(this); Parser parser(this);
return parser.parse(); return parser.parse();
} }
catch (triagens::arango::Exception const& ex) { catch (triagens::arango::Exception const& ex) {
return ParseResult(ex.code(), ex.message()); return QueryResult(ex.code(), ex.message());
} }
catch (...) { catch (...) {
return ParseResult(TRI_ERROR_OUT_OF_MEMORY, TRI_errno_string(TRI_ERROR_OUT_OF_MEMORY)); return QueryResult(TRI_ERROR_OUT_OF_MEMORY, TRI_errno_string(TRI_ERROR_OUT_OF_MEMORY));
} }
} }

View File

@ -32,7 +32,7 @@
#include "Basics/Common.h" #include "Basics/Common.h"
#include "Aql/BindParameters.h" #include "Aql/BindParameters.h"
#include "Aql/ParseResult.h" #include "Aql/QueryResult.h"
struct TRI_json_s; struct TRI_json_s;
struct TRI_vocbase_s; struct TRI_vocbase_s;
@ -142,16 +142,16 @@ namespace triagens {
char const* = nullptr); char const* = nullptr);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief execute an AQL query - TODO: implement and determine return type /// @brief execute an AQL query
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ParseResult execute (); QueryResult execute ();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief parse an AQL query /// @brief parse an AQL query
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ParseResult parse (); QueryResult parse ();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief explain an AQL query - TODO: implement and determine return type /// @brief explain an AQL query - TODO: implement and determine return type

View File

@ -1,5 +1,5 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief Aql, parse results /// @brief Aql, query results
/// ///
/// @file /// @file
/// ///
@ -27,8 +27,8 @@
/// @author Copyright 2012-2013, triAGENS GmbH, Cologne, Germany /// @author Copyright 2012-2013, triAGENS GmbH, Cologne, Germany
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#ifndef ARANGODB_AQL_PARSE_RESULT_H #ifndef ARANGODB_AQL_QUERY_RESULT_H
#define ARANGODB_AQL_PARSE_RESULT_H 1 #define ARANGODB_AQL_QUERY_RESULT_H 1
#include "Basics/Common.h" #include "Basics/Common.h"
#include "BasicsC/json.h" #include "BasicsC/json.h"
@ -37,13 +37,13 @@ namespace triagens {
namespace aql { namespace aql {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- struct ParseResult // --SECTION-- struct QueryResult
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
struct ParseResult { struct QueryResult {
ParseResult& operator= (ParseResult const& other) = delete; QueryResult& operator= (QueryResult const& other) = delete;
ParseResult (ParseResult&& other) { QueryResult (QueryResult&& other) {
code = other.code; code = other.code;
details = other.details; details = other.details;
json = other.json; json = other.json;
@ -51,7 +51,7 @@ namespace triagens {
other.json = nullptr; other.json = nullptr;
} }
ParseResult (int code, QueryResult (int code,
std::string const& details) std::string const& details)
: code(code), : code(code),
details(details), details(details),
@ -59,21 +59,21 @@ namespace triagens {
json(nullptr) { json(nullptr) {
} }
explicit ParseResult (int code) explicit QueryResult (int code)
: code(code), : code(code),
details(""), details(""),
zone(TRI_UNKNOWN_MEM_ZONE), zone(TRI_UNKNOWN_MEM_ZONE),
json(nullptr) { json(nullptr) {
} }
ParseResult () QueryResult ()
: code(TRI_ERROR_NO_ERROR), : code(TRI_ERROR_NO_ERROR),
details(), details(),
zone(TRI_UNKNOWN_MEM_ZONE), zone(TRI_UNKNOWN_MEM_ZONE),
json(nullptr) { json(nullptr) {
} }
~ParseResult () { ~QueryResult () {
if (json != nullptr) { if (json != nullptr) {
TRI_FreeJson(zone, json); TRI_FreeJson(zone, json);
} }

View File

@ -5397,71 +5397,6 @@ static v8::Handle<v8::Value> JS_ParseAql (v8::Arguments const& argv) {
return scope.Close(result); return scope.Close(result);
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief peng an AQL query
////////////////////////////////////////////////////////////////////////////////
class MyWorker : public triagens::aql::ExecutionBlock::WalkerWorker {
public:
int count;
MyWorker () : count(0) {};
~MyWorker () {};
void before (triagens::aql::ExecutionBlock* eb) {
std::cout << "Before node of type " << eb->getPlan()->getTypeString()
<< std::endl;
count++;
}
void after (triagens::aql::ExecutionBlock* eb) {
std::cout << "After node of type " << eb->getPlan()->getTypeString()
<< std::endl;
}
};
static v8::Handle<v8::Value> JS_PengAql (v8::Arguments const& argv) {
v8::HandleScope scope;
TRI_vocbase_t* vocbase = GetContextVocBase();
if (vocbase == nullptr) {
TRI_V8_EXCEPTION(scope, TRI_ERROR_ARANGO_DATABASE_NOT_FOUND);
}
if (argv.Length() != 0) {
TRI_V8_EXCEPTION_USAGE(scope, "AQL_PENG()");
}
triagens::aql::ExecutionPlan* singlePlan = new triagens::aql::SingletonPlan();
triagens::aql::ExecutionPlan* enumPlan = new triagens::aql::EnumerateCollectionPlan(vocbase, "fuxx", 1, "f");
enumPlan->addDependency(singlePlan);
triagens::aql::ExecutionPlan* rootPlan = new triagens::aql::RootPlan(1,"X");
rootPlan->addDependency(enumPlan);
triagens::aql::ExecutionBlock* exec = triagens::aql::ExecutionBlock::instanciatePlan (rootPlan);
exec->staticAnalysis();
MyWorker w;
exec->walk(w);
std::cout << "Count is " << w.count << std::endl;
exec->initialize();
exec->execute();
shared_ptr<triagens::aql::AqlItem> value;
while (nullptr != (value = exec->getOne())) {
std::cout << "Peng" << std::endl;
std::cout << value->getValue(0,0)->toString() << std::endl;
value.reset();
}
exec->shutdown();
delete exec;
delete rootPlan;
return scope.Close(v8::Undefined());
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief executes an AQL query /// @brief executes an AQL query
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -5499,14 +5434,16 @@ static v8::Handle<v8::Value> JS_ExecuteAql (v8::Arguments const& argv) {
// bind parameters will be freed by the query later // bind parameters will be freed by the query later
triagens::aql::Query query(vocbase, queryString.c_str(), queryString.size(), parameters); triagens::aql::Query query(vocbase, queryString.c_str(), queryString.size(), parameters);
auto parseResult = query.execute(); auto queryResult = query.execute();
if (parseResult.code != TRI_ERROR_NO_ERROR) { if (queryResult.code != TRI_ERROR_NO_ERROR) {
TRI_V8_EXCEPTION_FULL(scope, parseResult.code, parseResult.details); TRI_V8_EXCEPTION_FULL(scope, queryResult.code, queryResult.details);
} }
v8::Handle<v8::Object> result = v8::Object::New(); v8::Handle<v8::Object> result = v8::Object::New();
result->Set(TRI_V8_STRING("ast"), TRI_ObjectJson(parseResult.json)); if (queryResult.json != nullptr) {
result->Set(TRI_V8_STRING("json"), TRI_ObjectJson(queryResult.json));
}
return scope.Close(result); return scope.Close(result);
} }
@ -10778,7 +10715,6 @@ void TRI_InitV8VocBridge (v8::Handle<v8::Context> context,
// new AQL functions. not intended to be used directly by end users // new AQL functions. not intended to be used directly by end users
TRI_AddGlobalFunctionVocbase(context, "AQL_EXECUTE", JS_ExecuteAql, true); TRI_AddGlobalFunctionVocbase(context, "AQL_EXECUTE", JS_ExecuteAql, true);
TRI_AddGlobalFunctionVocbase(context, "AQL_PARSE", JS_ParseAql, true); TRI_AddGlobalFunctionVocbase(context, "AQL_PARSE", JS_ParseAql, true);
TRI_AddGlobalFunctionVocbase(context, "AQL_PENG", JS_PengAql, true);
// cursor functions. not intended to be used by end users // cursor functions. not intended to be used by end users
TRI_AddGlobalFunctionVocbase(context, "CURSOR", JS_Cursor, true); TRI_AddGlobalFunctionVocbase(context, "CURSOR", JS_Cursor, true);