mirror of https://gitee.com/bigwinds/arangodb
361 lines
18 KiB
JavaScript
361 lines
18 KiB
JavaScript
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tests for query language, variable access
|
|
///
|
|
/// @file
|
|
///
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var jsunity = require("jsunity");
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function ahuacatlQueryVariablesTestSuite () {
|
|
var users1 = null;
|
|
var users2 = null;
|
|
var airports = null;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief execute a given query
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function executeQuery (query) {
|
|
var cursor = AHUACATL_RUN(query, undefined);
|
|
if (cursor instanceof ArangoError) {
|
|
print(query, cursor.errorMessage);
|
|
}
|
|
assertFalse(cursor instanceof ArangoError);
|
|
return cursor;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief execute a given query and return the results as an array
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function getQueryResults (query) {
|
|
var result = executeQuery(query).getRows();
|
|
var results = [ ];
|
|
|
|
for (var i in result) {
|
|
if (!result.hasOwnProperty(i)) {
|
|
continue;
|
|
}
|
|
|
|
results.push(result[i]);
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
|
|
return {
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief set up
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
setUp : function () {
|
|
users1 = [
|
|
{ "id" : 1, "name" : "Max", "hobbies" : [ { "type" : "swimming" }, { "type" : "skating" } ], "friends": [ { "name" : "Peter", "id" : 1 } ] },
|
|
{ "id" : 2, "name" : "Vanessa", "hobbies" : [ { "type" : "running" }, { "type" : "cycling" } ], "friends" : [ { "name" : "Peter", "id" : 3 }, { "name" : "Max", "id" : 3 } ] },
|
|
{ "id" : 3, "name" : "Peter", "hobbies": [ ], "friends" : [ { "name" : "Peter" } ] }
|
|
];
|
|
|
|
users2 = [
|
|
{ "id" : 1, "name" : "Max", "address" : { "home" : { "street" : "arango road", "zip" : "abcde", "phone" : [ { "type" : "mobile", "number" : "555-1234567" }, { "type" : "fax", "number" : "555-2345678" } ] }, "work": { "street" : "cantaloupe way", "zip" : "xyzab", "phone" : [ { "type" : "landline", "number" : "555-5555555" } ] } } },
|
|
{ "id" : 2, "name" : "Vanessa", "address" : { "home" : { "street" : "one-way loop", "zip" : "4e2af", "phone" : [ { "type" : "landline", "number" : "555-4352367" } ] }, "work": { "street" : "workers ave", "zip" : "4e2af", "phone" : [ { "type" : "landline", "number" : "555-2214212" } ] } } },
|
|
{ "id" : 3, "name" : "Peter", "address" : { "home" : { "street" : "theather drive", "zip" : "99998", "phone" : [ { "type" : "mobile", "number" : "555-9624218" }, { "type" : "fax", "number" : "555-4425742" }, { "type" : "landline", "number" : "555-3485385" } ] } } }
|
|
];
|
|
|
|
airports = [
|
|
{ "continent" : { "name" : "Europe", "countries" : [
|
|
{ "name" : "DE", "airports" : [ { "name" : "CGN" }, { "name" : "DTM" }, { "name" : "DUS" } , { "name" : "MUC" }, { "name" : "FRA" }, { "name" : "TXL" }, { "name" : "THF" } ] },
|
|
{ "name" : "UK", "airports" : [ { "name" : "LHR" }, { "name" : "LGW" }, { "name" : "STN" } , { "name" : "LCY" }, { "name" : "MAN" } ] },
|
|
{ "name" : "FR", "airports" : [ { "name" : "CDG" }, { "name" : "ORY" }, { "name" : "LYN" } , { "name" : "MRS" } ] }
|
|
] } },
|
|
{ "continent" : { "name" : "America", "countries" : [
|
|
{ "name" : "US", "airports" : [ { "name" : "LGA" }, { "name" : "JFK" }, { "name" : "SFO" }, { "name" : "JER" }, { "name" : "ATL" } ] },
|
|
{ "name" : "CA", "airports" : [ { "name" : "YTO" }, { "name" : "YVR" }, { "name" : "YYC" } ] },
|
|
{ "name" : "CO", "airports" : [ { "name" : "BOG" } ] }
|
|
] } },
|
|
{ "continent" : { "name" : "Asia", "countries" : [
|
|
{ "name" : "JP", "airports" : [ { "name" : "NRT" }, { "name" : "HND" } , { "name" : "OKD" }, { "name" : "OKA" } ] },
|
|
] } }
|
|
];
|
|
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tear down
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
tearDown : function () {
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return an expanded variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testListExpansion1 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users1) + " RETURN { \"name\" : u.name, \"likes\": u.hobbies[*].type }";
|
|
var expected = [{ "name" : "Max", "likes" : ["swimming", "skating"] }, { "name" : "Vanessa", "likes" : ["running", "cycling"] }, { "name" : "Peter", "likes" : [ ] }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return an expanded variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testListExpansion2 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users1) + " RETURN { \"name\" : u.name, \"likes\": u.hobbies[*].type, \"friends\": u.friends[*].name }";
|
|
var expected = [{ "name" : "Max", "likes" : ["swimming", "skating"], "friends" : ["Peter"] }, { "name" : "Vanessa", "likes" : ["running", "cycling"], "friends" : ["Peter", "Max"] }, { "name" : "Peter", "likes" : [ ], "friends" : ["Peter"] }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return an expanded variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testListExpansion3 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"uid\" : u.id, \"phones\" : u.address.home.phone[*].number }";
|
|
var expected = [{ "uid" : 1, "phones" : ["555-1234567", "555-2345678"] }, { "uid" : 2, "phones" : ["555-4352367"] }, { "uid" : 3, "phones" : ["555-9624218", "555-4425742", "555-3485385"] }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return an expanded variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testListExpansion4 : function () {
|
|
var query = "FOR a IN " + JSON.stringify(airports) + " RETURN a.continent.countries[*].name";
|
|
var expected = [["DE", "UK", "FR"], ["US", "CA", "CO"], ["JP"]];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return an expanded variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testListExpansion5 : function () {
|
|
var query = "FOR a IN " + JSON.stringify(airports) + " RETURN a.continent.countries[*].airports[0].name";
|
|
var expected = [["CGN", "LHR", "CDG"], ["LGA", "YTO", "BOG"], ["NRT"]];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return an expanded variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testListExpansion6 : function () {
|
|
var query = "FOR a IN " + JSON.stringify(airports) + " RETURN a.continent.countries[*].airports[*][0].name";
|
|
var expected = [["CGN", "LHR", "CDG"], ["LGA", "YTO", "BOG"], ["NRT"]];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return an expanded variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testListExpansion7 : function () {
|
|
var query = "FOR a IN " + JSON.stringify(airports) + " RETURN a.continent.countries[*].airports[*][1].name";
|
|
var expected = [["DTM", "LGW", "ORY"], ["JFK", "YVR", null], ["HND"]];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a named variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testNamedAccess1 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"name\" : u.name, \"addr\" : u.address }";
|
|
var expected = [{ "name" : "Max", "addr" : { "home" : { "street" : "arango road", "zip" : "abcde", "phone" : [{ "type" : "mobile", "number" : "555-1234567" }, { "type" : "fax", "number" : "555-2345678" }] }, "work" : { "street" : "cantaloupe way", "zip" : "xyzab", "phone" : [{ "type" : "landline", "number" : "555-5555555" }] } } }, { "name" : "Vanessa", "addr" : { "home" : { "street" : "one-way loop", "zip" : "4e2af", "phone" : [{ "type" : "landline", "number" : "555-4352367" }] }, "work" : { "street" : "workers ave", "zip" : "4e2af", "phone" : [{ "type" : "landline", "number" : "555-2214212" }] } } }, { "name" : "Peter", "addr" : { "home" : { "street" : "theather drive", "zip" : "99998", "phone" : [{ "type" : "mobile", "number" : "555-9624218" }, { "type" : "fax", "number" : "555-4425742" }, { "type" : "landline", "number" : "555-3485385" }] } } }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a named variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testNamedAccess2 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"name\" : u.name, \"home\" : u.address.home }";
|
|
var expected = [{ "name" : "Max", "home" : { "street" : "arango road", "zip" : "abcde", "phone" : [{ "type" : "mobile", "number" : "555-1234567" }, { "type" : "fax", "number" : "555-2345678" }] } }, { "name" : "Vanessa", "home" : { "street" : "one-way loop", "zip" : "4e2af", "phone" : [{ "type" : "landline", "number" : "555-4352367" }] } }, { "name" : "Peter", "home" : { "street" : "theather drive", "zip" : "99998", "phone" : [{ "type" : "mobile", "number" : "555-9624218" }, { "type" : "fax", "number" : "555-4425742" }, { "type" : "landline", "number" : "555-3485385" }] } }] ;
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a named variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testNamedAccess3 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"name\" : u.name, \"str\" : u.address.home.street }";
|
|
var expected = [ { "name" : "Max", "str" : "arango road" }, { "name" : "Vanessa", "str" : "one-way loop" }, { "name" : "Peter", "str" : "theather drive" } ];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a named variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testNamedAccess4 : function () {
|
|
var query = "FOR a IN " + JSON.stringify(airports) + " RETURN a.continent.name";
|
|
var expected = [ "Europe", "America", "Asia" ];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a numerically indexed variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testIndexedAccess1 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users1) + " RETURN u.hobbies[0]";
|
|
var expected = [ { "type": "swimming" }, { "type" : "running" }, null ];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a numerically indexed variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testIndexedAccess2 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users1) + " RETURN u.hobbies[0].type";
|
|
var expected = [ "swimming", "running", null ];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a numerically indexed variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testIndexedAccess3 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"uid\" : u.id, \"phone\" : u.address.home.phone[0] }";
|
|
var expected = [{ "uid" : 1, "phone" : { "type" : "mobile", "number" : "555-1234567" } }, { "uid" : 2, "phone" : { "type" : "landline", "number" : "555-4352367" } }, { "uid" : 3, "phone" : { "type" : "mobile", "number" : "555-9624218" } }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a numerically indexed variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testIndexedAccess4 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"uid\" : u.id, \"phone\" : u.address.home.phone[1] }";
|
|
var expected = [{ "uid" : 1, "phone" : { "type" : "fax", "number" : "555-2345678" } }, { "uid" : 2, "phone" : null }, { "uid" : 3, "phone" : { "type" : "fax", "number" : "555-4425742" } }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a numerically indexed variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testIndexedAccess5 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"uid\" : u.id, \"phoneType\" : u.address.home.phone[0].type, \"phoneNum\" : u.address.home.phone[0].number }";
|
|
var expected = [{ "uid" : 1, "phoneType" : "mobile", "phoneNum" : "555-1234567" }, { "uid" : 2, "phoneType" : "landline", "phoneNum" : "555-4352367" }, { "uid" : 3, "phoneType" : "mobile", "phoneNum" : "555-9624218" }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a numerically indexed variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testIndexedAccess6 : function () {
|
|
var query = "FOR u IN " + JSON.stringify(users2) + " RETURN { \"uid\" : u.id, \"phoneType\" : u.address.home.phone[1].type, \"phoneNum\" : u.address.home.phone[1].number }";
|
|
var expected = [{ "uid" : 1, "phoneType" : "fax", "phoneNum" : "555-2345678" }, { "uid" : 2, "phoneType" : null, "phoneNum" : null }, { "uid" : 3, "phoneType" : "fax", "phoneNum" : "555-4425742" }];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return a numerically indexed variable
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testIndexedAccess7 : function () {
|
|
var query = "FOR a IN " + JSON.stringify(airports) + " RETURN a.continent.countries[0].airports[0].name";
|
|
var expected = ["CGN", "LGA", "NRT"];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief return data using quoted identifiers
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testEscapedAccess : function () {
|
|
var query = "FOR a IN " + JSON.stringify(airports) + " RETURN `a`.`continent`.`countries`[0].`airports`[0].`name`";
|
|
var expected = ["CGN", "LGA", "NRT"];
|
|
|
|
var actual = getQueryResults(query);
|
|
assertEqual(expected, actual);
|
|
},
|
|
|
|
};
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief executes the test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
jsunity.run(ahuacatlQueryVariablesTestSuite);
|
|
|
|
return jsunity.done();
|
|
|
|
// Local Variables:
|
|
// mode: outline-minor
|
|
// outline-regexp: "^\\(/// @brief\\|/// @addtogroup\\|// --SECTION--\\|/// @page\\|/// @}\\)"
|
|
// End:
|