1
0
Fork 0

fixes ported from 2.8

This commit is contained in:
Jan Steemann 2016-01-21 16:40:31 +01:00
parent d0ce5310e0
commit 6b19a7b0a7
8 changed files with 191 additions and 118 deletions

View File

@ -21,7 +21,7 @@
/// @author Michael Hackstein
////////////////////////////////////////////////////////////////////////////////
#include "Aql/Graphs.h"
#include "Graphs.h"
#include "Basics/JsonHelper.h"
using namespace arangodb::basics;
@ -81,7 +81,7 @@ arangodb::basics::Json Graph::toJson(TRI_memory_zone_t* z, bool verbose) const {
return json;
}
Graph::Graph(arangodb::basics::Json j) : _vertexColls(), _edgeColls() {
Graph::Graph(arangodb::basics::Json const& j) : _vertexColls(), _edgeColls() {
auto jsonDef = j.get(_attrEdgeDefs);
for (size_t i = 0; i < jsonDef.size(); ++i) {

View File

@ -30,11 +30,10 @@
namespace arangodb {
namespace aql {
class Graph {
public:
Graph(arangodb::basics::Json j);
Graph(arangodb::basics::Json const&);
~Graph() {}

View File

@ -126,6 +126,10 @@ TraversalNode::TraversalNode(ExecutionPlan* plan, size_t id,
_graphJson = arangodb::basics::Json(graphName);
_graphObj = plan->getAst()->query()->lookupGraphByName(graphName);
if (_graphObj == nullptr) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_GRAPH_NOT_FOUND);
}
auto eColls = _graphObj->edgeCollections();
for (const auto& n : eColls) {
_edgeColls.push_back(n);
@ -286,8 +290,12 @@ TraversalNode::TraversalNode(ExecutionPlan* plan,
if (base.has("graphDefinition")) {
_graphObj = plan->getAst()->query()->lookupGraphByName(graphName);
if (_graphObj == nullptr) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_GRAPH_NOT_FOUND);
}
auto eColls = _graphObj->edgeCollections();
for (const auto& n : eColls) {
for (auto const& n : eColls) {
_edgeColls.push_back(n);
}
} else {
@ -522,8 +530,18 @@ double TraversalNode::estimateCost(size_t& nrItems) const {
double depCost = _dependencies.at(0)->getCost(incoming);
double expectedEdgesPerDepth = 0;
auto collections = _plan->getAst()->query()->collections();
TRI_ASSERT(collections != nullptr);
for (auto const& it : _edgeColls) {
auto collection = collections->get(it);
if (collection == nullptr) {
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "unexpected pointer for collection");
}
TRI_ASSERT(collection != nullptr);
for (auto const& index : collection->getIndexes()) {
if (index->type ==
arangodb::Index::IndexType::TRI_IDX_TYPE_EDGE_INDEX) {

View File

@ -688,11 +688,11 @@ static const yytype_uint16 yyrline[] =
1004, 1006, 1011, 1014, 1014, 1030, 1033, 1039, 1042, 1048,
1048, 1057, 1059, 1064, 1067, 1073, 1076, 1090, 1090, 1099,
1101, 1106, 1108, 1113, 1127, 1131, 1140, 1147, 1150, 1156,
1159, 1165, 1168, 1171, 1177, 1180, 1186, 1189, 1196, 1200,
1207, 1213, 1212, 1221, 1225, 1234, 1237, 1240, 1246, 1249,
1255, 1287, 1290, 1293, 1300, 1310, 1310, 1323, 1338, 1352,
1366, 1366, 1409, 1412, 1418, 1425, 1435, 1438, 1441, 1444,
1447, 1453, 1456, 1459, 1469, 1475, 1478, 1483
1159, 1165, 1168, 1171, 1177, 1180, 1186, 1189, 1200, 1204,
1211, 1217, 1216, 1225, 1234, 1243, 1246, 1249, 1255, 1258,
1264, 1296, 1299, 1302, 1309, 1319, 1319, 1332, 1347, 1361,
1375, 1375, 1418, 1421, 1427, 1434, 1444, 1447, 1450, 1453,
1456, 1462, 1465, 1468, 1478, 1484, 1487, 1492
};
#endif
@ -3372,119 +3372,128 @@ yyreduce:
case 147:
#line 1189 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// TODO FIXME check @s
char const* p = (yyvsp[0].node)->getStringValue();
size_t const len = (yyvsp[0].node)->getStringLength();
if (len < 1 || *p != '@') {
parser->registerParseError(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE, TRI_errno_string(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE), p, yylloc.first_line, yylloc.first_column);
}
(yyval.node) = (yyvsp[0].node);
}
#line 3379 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3383 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 148:
#line 1196 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
auto node = static_cast<AstNode*>(parser->peekStack());
node->addMember((yyvsp[0].node));
}
#line 3388 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 149:
#line 1200 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
auto node = static_cast<AstNode*>(parser->peekStack());
node->addMember((yyvsp[0].node));
}
#line 3397 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3392 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 149:
#line 1204 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
auto node = static_cast<AstNode*>(parser->peekStack());
node->addMember((yyvsp[0].node));
}
#line 3401 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 150:
#line 1207 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1211 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
auto node = parser->ast()->createNodeArray();
node->addMember((yyvsp[0].node));
(yyval.node) = parser->ast()->createNodeCollectionList(node);
}
#line 3407 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3411 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 151:
#line 1213 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1217 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
auto node = parser->ast()->createNodeArray();
parser->pushStack(node);
node->addMember((yyvsp[-1].node));
}
#line 3417 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3421 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 152:
#line 1217 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1221 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
auto node = static_cast<AstNode*>(parser->popStack());
(yyval.node) = parser->ast()->createNodeCollectionList(node);
}
#line 3426 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3430 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 153:
#line 1221 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// graph name
(yyval.node) = (yyvsp[0].node);
}
#line 3435 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 154:
#line 1225 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// graph name
(yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length);
char const* p = (yyvsp[0].node)->getStringValue();
size_t const len = (yyvsp[0].node)->getStringLength();
if (len < 1 || *p == '@') {
parser->registerParseError(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE, TRI_errno_string(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE), p, yylloc.first_line, yylloc.first_column);
}
(yyval.node) = (yyvsp[0].node);
}
#line 3444 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 155:
case 154:
#line 1234 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// graph name
(yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length);
}
#line 3453 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 155:
#line 1243 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.intval) = 2;
}
#line 3452 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3461 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 156:
#line 1237 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1246 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.intval) = 1;
}
#line 3460 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3469 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 157:
#line 1240 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1249 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.intval) = 0;
}
#line 3468 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3477 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 158:
#line 1246 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1255 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeDirection((yyvsp[0].intval), 1);
}
#line 3476 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3485 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 159:
#line 1249 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1258 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeDirection((yyvsp[0].intval), (yyvsp[-1].node));
}
#line 3484 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3493 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 160:
#line 1255 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1264 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// variable or collection
auto ast = parser->ast();
@ -3517,27 +3526,27 @@ yyreduce:
(yyval.node) = node;
}
#line 3521 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3530 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 161:
#line 1287 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1296 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = (yyvsp[0].node);
}
#line 3529 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3538 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 162:
#line 1290 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1299 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = (yyvsp[0].node);
}
#line 3537 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3546 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 163:
#line 1293 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1302 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = (yyvsp[0].node);
@ -3545,11 +3554,11 @@ yyreduce:
ABORT_OOM
}
}
#line 3549 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3558 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 164:
#line 1300 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1309 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
if ((yyvsp[-1].node)->type == NODE_TYPE_EXPANSION) {
// create a dummy passthru node that reduces and evaluates the expansion first
@ -3560,20 +3569,20 @@ yyreduce:
(yyval.node) = (yyvsp[-1].node);
}
}
#line 3564 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3573 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 165:
#line 1310 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1319 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
parser->ast()->scopes()->start(arangodb::aql::AQL_SCOPE_SUBQUERY);
parser->ast()->startSubQuery();
}
#line 3573 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3582 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 166:
#line 1313 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1322 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
AstNode* node = parser->ast()->endSubQuery();
parser->ast()->scopes()->endCurrent();
@ -3584,11 +3593,11 @@ yyreduce:
(yyval.node) = parser->ast()->createNodeReference(variableName);
}
#line 3588 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3597 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 167:
#line 1323 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1332 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// named variable access, e.g. variable.reference
if ((yyvsp[-2].node)->type == NODE_TYPE_EXPANSION) {
@ -3604,11 +3613,11 @@ yyreduce:
(yyval.node) = parser->ast()->createNodeAttributeAccess((yyvsp[-2].node), (yyvsp[0].strval).value, (yyvsp[0].strval).length);
}
}
#line 3608 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3617 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 168:
#line 1338 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1347 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// named variable access, e.g. variable.@reference
if ((yyvsp[-2].node)->type == NODE_TYPE_EXPANSION) {
@ -3623,11 +3632,11 @@ yyreduce:
(yyval.node) = parser->ast()->createNodeBoundAttributeAccess((yyvsp[-2].node), (yyvsp[0].node));
}
}
#line 3627 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3636 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 169:
#line 1352 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1361 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// indexed variable access, e.g. variable[index]
if ((yyvsp[-3].node)->type == NODE_TYPE_EXPANSION) {
@ -3642,11 +3651,11 @@ yyreduce:
(yyval.node) = parser->ast()->createNodeIndexedAccess((yyvsp[-3].node), (yyvsp[-1].node));
}
}
#line 3646 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3655 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 170:
#line 1366 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1375 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
// variable expansion, e.g. variable[*], with optional FILTER, LIMIT and RETURN clauses
if ((yyvsp[0].intval) > 1 && (yyvsp[-2].node)->type == NODE_TYPE_EXPANSION) {
@ -3670,11 +3679,11 @@ yyreduce:
auto scopes = parser->ast()->scopes();
scopes->stackCurrentVariable(scopes->getVariable(nextName));
}
#line 3674 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3683 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 171:
#line 1388 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1397 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
auto scopes = parser->ast()->scopes();
scopes->unstackCurrentVariable();
@ -3693,27 +3702,27 @@ yyreduce:
(yyval.node) = parser->ast()->createNodeExpansion((yyvsp[-5].intval), iterator, parser->ast()->createNodeReference(variable->name), (yyvsp[-3].node), (yyvsp[-2].node), (yyvsp[-1].node));
}
}
#line 3697 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3706 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 172:
#line 1409 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1418 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = (yyvsp[0].node);
}
#line 3705 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3714 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 173:
#line 1412 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1421 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = (yyvsp[0].node);
}
#line 3713 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3722 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 174:
#line 1418 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1427 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
if ((yyvsp[0].node) == nullptr) {
ABORT_OOM
@ -3721,11 +3730,11 @@ yyreduce:
(yyval.node) = (yyvsp[0].node);
}
#line 3725 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3734 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 175:
#line 1425 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1434 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
if ((yyvsp[0].node) == nullptr) {
ABORT_OOM
@ -3733,67 +3742,67 @@ yyreduce:
(yyval.node) = (yyvsp[0].node);
}
#line 3737 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3746 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 176:
#line 1435 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1444 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length);
}
#line 3745 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3754 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 177:
#line 1438 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1447 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = (yyvsp[0].node);
}
#line 3753 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3762 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 178:
#line 1441 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1450 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeValueNull();
}
#line 3761 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3770 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 179:
#line 1444 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1453 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeValueBool(true);
}
#line 3769 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3778 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 180:
#line 1447 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1456 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeValueBool(false);
}
#line 3777 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3786 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 181:
#line 1453 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1462 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeCollection((yyvsp[0].strval).value, TRI_TRANSACTION_WRITE);
}
#line 3785 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3794 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 182:
#line 1456 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1465 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeCollection((yyvsp[0].strval).value, TRI_TRANSACTION_WRITE);
}
#line 3793 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3802 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 183:
#line 1459 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1468 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
if ((yyvsp[0].strval).length < 2 || (yyvsp[0].strval).value[0] != '@') {
parser->registerParseError(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE, TRI_errno_string(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE), (yyvsp[0].strval).value, yylloc.first_line, yylloc.first_column);
@ -3801,43 +3810,43 @@ yyreduce:
(yyval.node) = parser->ast()->createNodeParameter((yyvsp[0].strval).value, (yyvsp[0].strval).length);
}
#line 3805 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3814 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 184:
#line 1469 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1478 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.node) = parser->ast()->createNodeParameter((yyvsp[0].strval).value, (yyvsp[0].strval).length);
}
#line 3813 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3822 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 185:
#line 1475 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1484 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.strval) = (yyvsp[0].strval);
}
#line 3821 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3830 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 186:
#line 1478 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1487 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.strval) = (yyvsp[0].strval);
}
#line 3829 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3838 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
case 187:
#line 1483 "arangod/Aql/grammar.y" /* yacc.c:1646 */
#line 1492 "arangod/Aql/grammar.y" /* yacc.c:1646 */
{
(yyval.strval) = (yyvsp[0].strval);
}
#line 3837 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3846 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
break;
#line 3841 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
#line 3850 "arangod/Aql/grammar.cpp" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires

View File

@ -1187,7 +1187,11 @@ graph_collection:
$$ = parser->ast()->createNodeValueString($1.value, $1.length);
}
| bind_parameter {
// TODO FIXME check @s
char const* p = $1->getStringValue();
size_t const len = $1->getStringLength();
if (len < 1 || *p != '@') {
parser->registerParseError(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE, TRI_errno_string(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE), p, yylloc.first_line, yylloc.first_column);
}
$$ = $1;
}
;
@ -1220,6 +1224,11 @@ graph_subject:
}
| T_GRAPH bind_parameter {
// graph name
char const* p = $2->getStringValue();
size_t const len = $2->getStringLength();
if (len < 1 || *p == '@') {
parser->registerParseError(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE, TRI_errno_string(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE), p, yylloc.first_line, yylloc.first_column);
}
$$ = $2;
}
| T_GRAPH T_QUOTED_STRING {

View File

@ -100,6 +100,8 @@ class MultiCollectionEdgeExpander {
void operator()(VertexId& source, std::vector<ArangoDBPathFinder::Step*>& result) {
equal_to<VertexId> eq;
for (auto const& edgeCollection : _edgeCollections) {
TRI_ASSERT(edgeCollection != nullptr);
auto edges = edgeCollection->getEdges(_direction, source);
std::unordered_map<VertexId, size_t> candidates;
@ -157,6 +159,7 @@ class SimpleEdgeExpander {
: _direction(direction), _edgeCollection(edgeCollection){};
void operator()(VertexId& source, std::vector<ArangoDBPathFinder::Step*>& result) {
TRI_ASSERT(_edgeCollection != nullptr);
auto edges = _edgeCollection->getEdges(_direction, source);
equal_to<VertexId> eq;
@ -262,20 +265,20 @@ void BasicOptions::addEdgeFilter(v8::Isolate* isolate,
useEdgeFilter = true;
auto it = _edgeFilter.find(cid);
if (it != _edgeFilter.end()) {
return;
}
if (example->IsArray()) {
if (it == _edgeFilter.end()) {
_edgeFilter.emplace(
cid, new ExampleMatcher(isolate, v8::Handle<v8::Array>::Cast(example),
shaper, errorMessage));
}
_edgeFilter.emplace(
cid, new ExampleMatcher(isolate, v8::Handle<v8::Array>::Cast(example),
shaper, errorMessage));
} else {
// Has to be Object
if (it == _edgeFilter.end()) {
_edgeFilter.emplace(
cid,
new ExampleMatcher(isolate, v8::Handle<v8::Object>::Cast(example),
shaper, errorMessage));
}
_edgeFilter.emplace(
cid,
new ExampleMatcher(isolate, v8::Handle<v8::Object>::Cast(example),
shaper, errorMessage));
}
}
@ -424,6 +427,7 @@ TRI_RunSimpleShortestPathSearch(std::vector<EdgeCollectionInfo*>& collectionInfo
VertexId& v, std::vector<EdgeId>& res_edges, vector<VertexId>& neighbors) {
equal_to<VertexId> eq;
for (auto const& edgeCollection : collectionInfos) {
TRI_ASSERT(edgeCollection != nullptr);
auto edges = edgeCollection->getEdges(forward, v);
for (size_t j = 0; j < edges.size(); ++j) {
EdgeId edgeId = edgeCollection->extractEdgeId(edges[j]);
@ -445,6 +449,7 @@ TRI_RunSimpleShortestPathSearch(std::vector<EdgeCollectionInfo*>& collectionInfo
VertexId& v, std::vector<EdgeId>& res_edges, vector<VertexId>& neighbors) {
equal_to<VertexId> eq;
for (auto const& edgeCollection : collectionInfos) {
TRI_ASSERT(edgeCollection != nullptr);
auto edges = edgeCollection->getEdges(backward, v);
for (size_t j = 0; j < edges.size(); ++j) {
EdgeId edgeId = edgeCollection->extractEdgeId(edges[j]);
@ -483,6 +488,8 @@ static void InboundNeighbors(std::vector<EdgeCollectionInfo*>& collectionInfos,
std::unordered_set<VertexId> nextDepth;
for (auto const& col : collectionInfos) {
TRI_ASSERT(col != nullptr);
for (VertexId const& start : startVertices) {
auto edges = col->getEdges(dir, start);
for (size_t j = 0; j < edges.size(); ++j) {
@ -528,6 +535,7 @@ static void OutboundNeighbors(std::vector<EdgeCollectionInfo*>& collectionInfos,
std::unordered_set<VertexId> nextDepth;
for (auto const& col : collectionInfos) {
TRI_ASSERT(col != nullptr);
for (VertexId const& start : startVertices) {
auto edges = col->getEdges(dir, start);
@ -572,6 +580,7 @@ static void AnyNeighbors(std::vector<EdgeCollectionInfo*>& collectionInfos,
std::unordered_set<VertexId> nextDepth;
for (auto const& col : collectionInfos) {
TRI_ASSERT(col != nullptr);
for (VertexId const& start : startVertices) {
dir = TRI_EDGE_OUT;
auto edges = col->getEdges(dir, start);
@ -694,6 +703,12 @@ Json* SingleServerTraversalPath::edgeToJson(Transaction* trx,
CollectionNameResolver* resolver,
EdgeInfo const& e) {
auto collection = trx->trxCollection(e.cid);
if (collection == nullptr) {
THROW_ARANGO_EXCEPTION(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND);
}
TRI_ASSERT(collection != nullptr);
TRI_shaped_json_t shapedJson;
TRI_EXTRACT_SHAPED_JSON_MARKER(shapedJson, &e.mptr);
return new Json(
@ -755,9 +770,14 @@ DepthFirstTraverser::DepthFirstTraverser(
bool DepthFirstTraverser::edgeMatchesConditions(TRI_doc_mptr_t& e,
size_t& eColIdx, size_t depth) {
TRI_ASSERT(_expressions != nullptr);
auto it = _expressions->find(depth);
if (it != _expressions->end()) {
for (auto const& exp : it->second) {
TRI_ASSERT(exp != nullptr);
if (exp->isEdgeAccess &&
!exp->matchesCheck(e, _edgeCols.at(eColIdx), _resolver)) {
++_filteredPaths;
@ -770,12 +790,17 @@ bool DepthFirstTraverser::edgeMatchesConditions(TRI_doc_mptr_t& e,
bool DepthFirstTraverser::vertexMatchesConditions(VertexId const& v,
size_t depth) {
TRI_ASSERT(_expressions != nullptr);
auto it = _expressions->find(depth);
if (it != _expressions->end()) {
TRI_doc_mptr_copy_t mptr;
TRI_document_collection_t* docCol = nullptr;
bool fetchVertex = true;
for (auto const& exp : it->second) {
TRI_ASSERT(exp != nullptr);
if (!exp->isEdgeAccess) {
if (fetchVertex) {
fetchVertex = false;
@ -809,6 +834,8 @@ bool DepthFirstTraverser::vertexMatchesConditions(VertexId const& v,
// This needs a different check method now.
// Innerloop here
for (auto const& exp2 : it->second) {
TRI_ASSERT(exp2 != nullptr);
if (!exp2->isEdgeAccess) {
if (!exp2->matchesCheck(tmp.json())) {
++_filteredPaths;
@ -988,13 +1015,18 @@ void DepthFirstTraverser::_defInternalFunctions() {
void DepthFirstTraverser::setStartVertex(
arangodb::traverser::VertexId const& v) {
TRI_ASSERT(_expressions != nullptr);
auto it = _expressions->find(0);
if (it != _expressions->end()) {
if (!it->second.empty()) {
TRI_doc_mptr_copy_t mptr;
TRI_document_collection_t* docCol = nullptr;
bool fetchVertex = true;
for (auto const& exp : it->second) {
TRI_ASSERT(exp != nullptr);
if (!exp->isEdgeAccess) {
if (fetchVertex) {
fetchVertex = false;

View File

@ -371,6 +371,9 @@ bool ExampleMatcher::matches(TRI_voc_cid_t cid,
// Match _to
it = def._internal.find(internalAttr::to);
if (it != def._internal.end()) {
if (! TRI_IS_EDGE_MARKER(mptr)) {
goto nextExample;
}
if (it->second.cid != TRI_EXTRACT_MARKER_TO_CID(mptr)) {
goto nextExample;
}
@ -382,6 +385,9 @@ bool ExampleMatcher::matches(TRI_voc_cid_t cid,
// Match _from
it = def._internal.find(internalAttr::from);
if (it != def._internal.end()) {
if (! TRI_IS_EDGE_MARKER(mptr)) {
goto nextExample;
}
if (it->second.cid != TRI_EXTRACT_MARKER_FROM_CID(mptr)) {
goto nextExample;
}

View File

@ -104,7 +104,7 @@ if (typeof internal.arango !== 'undefined') {
exports.plainServerVersion = function() {
if (internal.arango) {
let version = internal.arango.getVersion();
let devel = version.match(/(.*)-(rc[0-9]*|devel)$/);
let devel = version.match(/(.*)-((alpha|beta|devel|rc)[0-9]*)$/);
if (devel !== null) {
version = devel[1];