mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'aql2' of ssh://github.com/triAGENS/ArangoDB into aql2
This commit is contained in:
commit
48a14825ea
|
@ -535,7 +535,6 @@ AstNode* Ast::createNodeIterator (char const* variableName,
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief create an AST null value node
|
/// @brief create an AST null value node
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -264,6 +264,21 @@ void V8Executor::generateCodeReference (AstNode const* node) {
|
||||||
_buffer->appendText("\"]");
|
_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
|
/// @brief generate JavaScript code for a full collection access
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -308,6 +323,78 @@ void V8Executor::generateCodeFunctionCall (AstNode const* node) {
|
||||||
_buffer->appendText(")");
|
_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
|
/// @brief generate JavaScript code for a node
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -359,9 +446,29 @@ void V8Executor::generateCodeNode (AstNode const* node) {
|
||||||
generateCodeFunctionCall(node);
|
generateCodeFunctionCall(node);
|
||||||
break;
|
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:
|
case NODE_TYPE_ATTRIBUTE_ACCESS:
|
||||||
|
generateCodeNamedAccess(node);
|
||||||
|
break;
|
||||||
|
|
||||||
case NODE_TYPE_INDEXED_ACCESS:
|
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:
|
default:
|
||||||
// TODO: remove debug output
|
// TODO: remove debug output
|
||||||
|
|
|
@ -122,6 +122,12 @@ namespace triagens {
|
||||||
|
|
||||||
void generateCodeReference (AstNode const*);
|
void generateCodeReference (AstNode const*);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief generate JavaScript code for a variable
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void generateCodeVariable (AstNode const*);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief generate JavaScript code for a full collection access
|
/// @brief generate JavaScript code for a full collection access
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -134,6 +140,36 @@ namespace triagens {
|
||||||
|
|
||||||
void generateCodeFunctionCall (AstNode const*);
|
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
|
/// @brief generate JavaScript code for a node
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue