Commit 5dbd4ad1 authored by Tristan Cavelier's avatar Tristan Cavelier

queries: most of the methods check the type of the given parameters

parent 7197e485
...@@ -65,6 +65,19 @@ function Query() { ...@@ -65,6 +65,19 @@ function Query() {
*/ */
Query.prototype.exec = function (item_list, option) { Query.prototype.exec = function (item_list, option) {
var i = 0; var i = 0;
if (!Array.isArray(item_list)) {
throw new TypeError("Query().exec(): Argument 1 is not of type 'array'");
}
if (option === undefined) {
option = {};
}
if (typeof option !== 'object') {
throw new TypeError("Query().exec(): " +
"Optional argument 2 is not of type 'object'");
}
if (option.wildcard_character === undefined) {
option.wildcard_character = '%';
}
while (i < item_list.length) { while (i < item_list.length) {
if (!this.match(item_list[i], option.wildcard_character)) { if (!this.match(item_list[i], option.wildcard_character)) {
item_list.splice(i, 1); item_list.splice(i, 1);
......
...@@ -33,7 +33,8 @@ QueryFactory.create = function (object) { ...@@ -33,7 +33,8 @@ QueryFactory.create = function (object) {
query_class_dict[object.type]) { query_class_dict[object.type]) {
return new query_class_dict[object.type](object); return new query_class_dict[object.type](object);
} }
return null; throw new TypeError("QueryFactory.create(): " +
"Argument 1 is not a search text or a parsable object");
}; };
_export("QueryFactory", QueryFactory); _export("QueryFactory", QueryFactory);
...@@ -11,6 +11,8 @@ function stringEscapeRegexpCharacters(string) { ...@@ -11,6 +11,8 @@ function stringEscapeRegexpCharacters(string) {
if (typeof string === "string") { if (typeof string === "string") {
return string.replace(/([\\\.\$\[\]\(\)\{\}\^\?\*\+\-])/g, "\\$1"); return string.replace(/([\\\.\$\[\]\(\)\{\}\^\?\*\+\-])/g, "\\$1");
} }
throw new TypeError("complex_queries.stringEscapeRegexpCharacters(): " +
"Argument no 1 is not of type 'string'");
} }
_export("stringEscapeRegexpCharacters", stringEscapeRegexpCharacters); _export("stringEscapeRegexpCharacters", stringEscapeRegexpCharacters);
...@@ -28,9 +30,13 @@ function sortFunction(key, way) { ...@@ -28,9 +30,13 @@ function sortFunction(key, way) {
return a[key] < b[key] ? 1 : a[key] > b[key] ? -1 : 0; return a[key] < b[key] ? 1 : a[key] > b[key] ? -1 : 0;
}; };
} }
return function (a, b) { if (way === 'ascending') {
return a[key] > b[key] ? 1 : a[key] < b[key] ? -1 : 0; return function (a, b) {
}; return a[key] > b[key] ? 1 : a[key] < b[key] ? -1 : 0;
};
}
throw new TypeError("complex_queries.sortFunction(): " +
"Argument 2 must be 'ascending' or 'descending'");
} }
/** /**
...@@ -42,7 +48,7 @@ function sortFunction(key, way) { ...@@ -42,7 +48,7 @@ function sortFunction(key, way) {
*/ */
function deepClone(object) { function deepClone(object) {
var i, cloned; var i, cloned;
if (Object.prototype.toString.call(object) === "[object Array]") { if (Array.isArray(object)) {
cloned = []; cloned = [];
for (i = 0; i < object.length; i += 1) { for (i = 0; i < object.length; i += 1) {
cloned[i] = deepClone(object[i]); cloned[i] = deepClone(object[i]);
...@@ -97,7 +103,15 @@ function emptyFunction() {} ...@@ -97,7 +103,15 @@ function emptyFunction() {}
*/ */
function select(select_option, list, clone) { function select(select_option, list, clone) {
var i, j, new_item; var i, j, new_item;
if (clone) { if (!Array.isArray(select_option)) {
throw new TypeError("complex_queries.select(): " +
"Argument 1 is not of type Array");
}
if (!Array.isArray(list)) {
throw new TypeError("complex_queries.select(): " +
"Argument 2 is not of type Array");
}
if (clone === true) {
list = deepClone(list); list = deepClone(list);
} }
for (i = 0; i < list.length; i += 1) { for (i = 0; i < list.length; i += 1) {
...@@ -128,6 +142,10 @@ _export('select', select); ...@@ -128,6 +142,10 @@ _export('select', select);
*/ */
function sortOn(sort_on_option, list, clone) { function sortOn(sort_on_option, list, clone) {
var sort_index; var sort_index;
if (!Array.isArray(sort_on_option)) {
throw new TypeError("complex_queries.sortOn(): " +
"Argument 1 is not of type 'array'");
}
if (clone) { if (clone) {
list = deepClone(list); list = deepClone(list);
} }
...@@ -153,6 +171,14 @@ _export('sortOn', sortOn); ...@@ -153,6 +171,14 @@ _export('sortOn', sortOn);
* @return {Array} The filtered list * @return {Array} The filtered list
*/ */
function limit(limit_option, list, clone) { function limit(limit_option, list, clone) {
if (!Array.isArray(limit_option)) {
throw new TypeError("complex_queries.limit(): " +
"Argument 1 is not of type 'array'");
}
if (!Array.isArray(list)) {
throw new TypeError("complex_queries.limit(): " +
"Argument 2 is not of type 'array'");
}
if (clone) { if (clone) {
list = deepClone(list); list = deepClone(list);
} }
...@@ -173,8 +199,20 @@ _export('limit', limit); ...@@ -173,8 +199,20 @@ _export('limit', limit);
* @return {RegExp} The search text regexp * @return {RegExp} The search text regexp
*/ */
function convertStringToRegExp(string, wildcard_character) { function convertStringToRegExp(string, wildcard_character) {
if (typeof string !== 'string') {
throw new TypeError("complex_queries.convertStringToRegExp(): " +
"Argument 1 is not of type 'string'");
}
if (wildcard_character === undefined ||
wildcard_character === null || wildcard_character === '') {
return new RegExp("^" + stringEscapeRegexpCharacters(string) + "$");
}
if (typeof wildcard_character !== 'string' || wildcard_character.length > 1) {
throw new TypeError("complex_queries.convertStringToRegExp(): " +
"Optional argument 2 must be a string of length <= 1");
}
return new RegExp("^" + stringEscapeRegexpCharacters(string).replace( return new RegExp("^" + stringEscapeRegexpCharacters(string).replace(
stringEscapeRegexpCharacters(wildcard_character), new RegExp(stringEscapeRegexpCharacters(wildcard_character), 'g'),
'.*' '.*'
) + "$"); ) + "$");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment