1
0
Fork 0

fixed sort in sub-queries

This commit is contained in:
Jan Steemann 2012-05-07 10:34:52 +02:00
parent ba4eb1c647
commit 1c03ce7f72
2 changed files with 16 additions and 21 deletions

View File

@ -1216,6 +1216,7 @@ static void ProcessSort (TRI_aql_codegen_js_t* const generator,
resultRegister = IncRegister(generator);
scope = CurrentScope(generator);
scope->_resultRegister = resultRegister;
InitList(generator, resultRegister);
StartFor(generator, sourceRegister, NULL);
@ -1407,14 +1408,22 @@ static void ProcessAssign (TRI_aql_codegen_js_t* const generator,
const TRI_aql_node_t* const node) {
TRI_aql_node_t* nameNode = TRI_AQL_NODE_MEMBER(node, 0);
TRI_aql_codegen_register_t resultRegister = IncRegister(generator);
TRI_aql_codegen_register_t lastResultRegister;
TRI_aql_codegen_scope_t* scope = CurrentScope(generator);
InitList(generator, resultRegister);
StartScope(generator, scope->_buffer, TRI_AQL_SCOPE_LET, 0, 0, 0, resultRegister, NULL, "let");
ProcessNode(generator, TRI_AQL_NODE_MEMBER(node, 1));
lastResultRegister = CurrentScope(generator)->_resultRegister;
EndScope(generator);
if (lastResultRegister > 0) {
// result register was modified inside the scope, e.g. due to a SORT
resultRegister = lastResultRegister;
}
// enter the new variable in the symbol table
EnterSymbol(generator, nameNode->_value._value._string, resultRegister);
}
@ -1671,8 +1680,8 @@ char* TRI_GenerateCodeAql (const void* const data) {
FreeGenerator(generator);
if (code) {
LOG_DEBUG("generated code: %s", code);
// printf("generated code: %s", code);
LOG_TRACE("generated code: %s", code);
// printf("generated code: %s", code);
}
return code;

View File

@ -531,19 +531,6 @@ function ahuacatlQueryCollectionTestSuite () {
assertEqual(expected, actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test multiple collects
////////////////////////////////////////////////////////////////////////////////
/*
testCollectMultiple : function () {
// fix this
var expected = [ { "gender" : "f", "numUsers" : 10 }, { "gender" : "m", "numUsers" : 10 } ];
actual = getQueryResults("FOR u in " + users.name() + " COLLECT gender = u.gender, active = u.active INTO g COLLECT agender = gender, numUsers = LENGTH(g) RETURN { \"gender\" : agender, \"numUsers\" : numUsers }", false);
print("FOR u in " + users.name() + " COLLECT gender = u.gender, active = u.active INTO g COLLECT agender = gender, numUsers = LENGTH(g) RETURN { \"gender\" : agender, \"numUsers\" : numUsers }");
assertEqual(expected, actual);
},
*/
////////////////////////////////////////////////////////////////////////////////
/// @brief test relations
////////////////////////////////////////////////////////////////////////////////
@ -555,14 +542,14 @@ function ahuacatlQueryCollectionTestSuite () {
assertEqual(expected, actual);
},
/*
////////////////////////////////////////////////////////////////////////////////
/// @brief test relations
////////////////////////////////////////////////////////////////////////////////
testRelations2 : function () {
var expected = [ { "friends" : [102, 106, 108], "name" : "Abigail" }, { "friends" : [100, 108], "name" : "Michael" }, { "friends" : [100, 203], "name" : "Sophia" }, { "friends" : [203, 205], "name" : "Mariah" } ];
actual = getQueryResults("FOR u in " + users.name() + " FILTER u.active == true LET f = ((FOR r IN " + relations.name() + " FILTER r.from == u.id && r.type == \"friend\" SORT r.from RETURN r)) SORT LENGTH(f) DESC LIMIT 0,4 FILTER LENGTH(f) > 0 RETURN { \"name\" : u.name, \"friends\" : f[*].to }", false);
actual = getQueryResults("FOR u in " + users.name() + " FILTER u.active == true LET f = ((FOR r IN " + relations.name() + " FILTER r.from == u.id && r.type == \"friend\" SORT r.to RETURN r)) SORT LENGTH(f) DESC LIMIT 0,4 FILTER LENGTH(f) > 0 RETURN { \"name\" : u.name, \"friends\" : f[*].to }", false);
assertEqual(expected, actual);
},
@ -582,7 +569,7 @@ function ahuacatlQueryCollectionTestSuite () {
////////////////////////////////////////////////////////////////////////////////
testRelations4 : function () {
var expected = [ { "friends" : ["Daniel", "Jacob", "Jim"], "name" : "Abigail" }, { "friends" : ["Jim", "John"], "name" : "Michael" }, { "friends" : ["Madison", "John"], "name" : "Sophia" }, { "friends" : ["Eva", "Madison"], "name" : "Mariah" } ];
var expected = [ { "friends" : [ "Daniel", "Jacob", "Jim" ], "name" : "Abigail" }, { "friends" : [ "Jim", "John" ], "name" : "Michael" }, { "friends" : [ "John", "Madison" ], "name" : "Sophia" }, { "friends" : [ "Eva", "Madison" ], "name" : "Mariah" } ];
actual = getQueryResults("FOR u in " + users.name() + " FILTER u.active == true LET f = ((FOR r IN " + relations.name() + " FILTER r.from == u.id && r.type == \"friend\" FOR u2 IN " + users.name() + " FILTER r.to == u2.id SORT u2.name RETURN u2)) SORT LENGTH(f) DESC LIMIT 0,4 FILTER LENGTH(f) > 0 RETURN { \"name\" : u.name, \"friends\" : f[*].name }", false);
assertEqual(expected, actual);
@ -593,12 +580,11 @@ function ahuacatlQueryCollectionTestSuite () {
////////////////////////////////////////////////////////////////////////////////
testRelations5 : function () {
var expected = [ { "friendIds" : [ 106, 102, 100 ], "friendNames" : ["Daniel", "Jacob", "Jim"], "name" : "Abigail" }, { "friendIds" : [ 108, 100 ], "friendName" : ["Jim", "John"], "name" : "Michael" }, { "friendIds" : [ 203, 100 ], "friendNames" : ["Madison", "John"], "name" : "Sophia" }, { "friendIds" : [ 205, 203 ], "friendNames" : ["Eva", "Madison"], "name" : "Mariah" } ];
var expected = [ { "friendIds" : [ 106, 102, 108 ], "friendNames" : ["Daniel", "Jacob", "Jim"], "name" : "Abigail" }, { "friendIds" : [ 108, 100 ], "friendNames" : ["Jim", "John"], "name" : "Michael" }, { "friendIds" : [ 100, 203 ], "friendNames" : ["John","Madison"], "name" : "Sophia" }, { "friendIds" : [ 205, 203 ], "friendNames" : ["Eva", "Madison"], "name" : "Mariah" } ];
actual = getQueryResults("FOR u in " + users.name() + " FILTER u.active == true LET f = ((FOR r IN " + relations.name() + " FILTER r.from == u.id && r.type == \"friend\" FOR u2 IN " + users.name() + " FILTER r.to == u2.id SORT u2.name RETURN u2)) SORT LENGTH(f) DESC LIMIT 0,4 FILTER LENGTH(f) > 0 RETURN { \"name\" : u.name, \"friendNames\" : f[*].name, \"friendIds\" : f[*].id }", false);
assertEqual(expected, actual);
}
*/
};
}