1
0
Fork 0

Merge branch 'aql2' of ssh://github.com/triAGENS/ArangoDB into aql2

This commit is contained in:
Max Neunhoeffer 2014-08-01 10:28:44 +02:00
commit 48a14825ea
3 changed files with 144 additions and 2 deletions

View File

@ -535,7 +535,6 @@ AstNode* Ast::createNodeIterator (char const* variableName,
return node;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief create an AST null value node
////////////////////////////////////////////////////////////////////////////////

View File

@ -264,6 +264,21 @@ void V8Executor::generateCodeReference (AstNode const* node) {
_buffer->appendText("\"]");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a variable
////////////////////////////////////////////////////////////////////////////////
void V8Executor::generateCodeVariable (AstNode const* node) {
TRI_ASSERT(node != nullptr);
TRI_ASSERT(node->numMembers() == 0);
auto variable = static_cast<Variable*>(node->getData());
_buffer->appendText("vars[\"");
_buffer->appendJsonEncoded(variable->name.c_str());
_buffer->appendText("\"]");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a full collection access
////////////////////////////////////////////////////////////////////////////////
@ -308,6 +323,78 @@ void V8Executor::generateCodeFunctionCall (AstNode const* node) {
_buffer->appendText(")");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for an expansion (i.e. [*] operator)
////////////////////////////////////////////////////////////////////////////////
void V8Executor::generateCodeExpand (AstNode const* node) {
TRI_ASSERT(node != nullptr);
TRI_ASSERT(node->numMembers() == 2);
_buffer->appendText("(function () { var r = []; return ");
generateCodeNode(node->getMember(0));
_buffer->appendText(".forEach(function (v) { r.push_back(");
generateCodeNode(node->getMember(1));
_buffer->appendText("); }); })()");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for an expansion iterator
////////////////////////////////////////////////////////////////////////////////
void V8Executor::generateCodeExpandIterator (AstNode const* node) {
TRI_ASSERT(node != nullptr);
TRI_ASSERT(node->numMembers() == 2);
// intentionally do not stringify node 0
generateCodeNode(node->getMember(1));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a range (i.e. 1..10)
////////////////////////////////////////////////////////////////////////////////
void V8Executor::generateCodeRange (AstNode const* node) {
TRI_ASSERT(node != nullptr);
TRI_ASSERT(node->numMembers() == 2);
_buffer->appendText("aql.RANGE(");
generateCodeNode(node->getMember(0));
_buffer->appendText(", ");
generateCodeNode(node->getMember(1));
_buffer->appendText(")");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a named attribute access
////////////////////////////////////////////////////////////////////////////////
void V8Executor::generateCodeNamedAccess (AstNode const* node) {
TRI_ASSERT(node != nullptr);
TRI_ASSERT(node->numMembers() == 1);
_buffer->appendText("aql.DOCUMENT_MEMBER(");
generateCodeNode(node->getMember(0));
_buffer->appendText(", \"");
_buffer->appendJsonEncoded(node->getStringValue());
_buffer->appendText("\")");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for an indexed attribute access
////////////////////////////////////////////////////////////////////////////////
void V8Executor::generateCodeIndexedAccess (AstNode const* node) {
TRI_ASSERT(node != nullptr);
TRI_ASSERT(node->numMembers() == 2);
_buffer->appendText("aql.GET_INDEX(");
generateCodeNode(node->getMember(0));
_buffer->appendText(", ");
generateCodeNode(node->getMember(1));
_buffer->appendText(")");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a node
////////////////////////////////////////////////////////////////////////////////
@ -358,10 +445,30 @@ void V8Executor::generateCodeNode (AstNode const* node) {
case NODE_TYPE_FCALL:
generateCodeFunctionCall(node);
break;
case NODE_TYPE_EXPAND:
generateCodeExpand(node);
break;
case NODE_TYPE_ITERATOR:
generateCodeExpandIterator(node);
break;
case NODE_TYPE_RANGE:
generateCodeRange(node);
break;
case NODE_TYPE_ATTRIBUTE_ACCESS:
generateCodeNamedAccess(node);
break;
case NODE_TYPE_INDEXED_ACCESS:
// TODO:
generateCodeIndexedAccess(node);
break;
case NODE_TYPE_VARIABLE:
// we're not expecting a variable here
THROW_ARANGO_EXCEPTION(TRI_ERROR_INTERNAL);
default:
// TODO: remove debug output

View File

@ -122,6 +122,12 @@ namespace triagens {
void generateCodeReference (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a variable
////////////////////////////////////////////////////////////////////////////////
void generateCodeVariable (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a full collection access
////////////////////////////////////////////////////////////////////////////////
@ -134,6 +140,36 @@ namespace triagens {
void generateCodeFunctionCall (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for an expansion (i.e. [*] operator)
////////////////////////////////////////////////////////////////////////////////
void generateCodeExpand (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for an expansion iterator
////////////////////////////////////////////////////////////////////////////////
void generateCodeExpandIterator (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a range (i.e. 1..10)
////////////////////////////////////////////////////////////////////////////////
void generateCodeRange (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a named attribute access
////////////////////////////////////////////////////////////////////////////////
void generateCodeNamedAccess (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for an indexed attribute access
////////////////////////////////////////////////////////////////////////////////
void generateCodeIndexedAccess (AstNode const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generate JavaScript code for a node
////////////////////////////////////////////////////////////////////////////////