Commit b1145bbb authored by Sven Franck's avatar Sven Franck

allow for complex queries with undefined query (select all), added tests

parent e5ac3ede
...@@ -310,8 +310,15 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -310,8 +310,15 @@ jIO.addStorageType('indexed', function (spec, my) {
priv.findBestIndexForQuery = function (syntax) { priv.findBestIndexForQuery = function (syntax) {
var i, j, k, l, n, p, o, element, key, block, var i, j, k, l, n, p, o, element, key, block,
search_ids, use_index = [], select_ids = {}, index, query_param, search_ids, use_index = [], select_ids = {}, index, query_param,
// need to parse into object current_query, current_query_size;
// try to parse into object
if (syntax.query !== undefined) {
current_query = jIO.ComplexQueries.parse(syntax.query); current_query = jIO.ComplexQueries.parse(syntax.query);
} else {
current_query = {};
current_query_size = 0;
}
// loop indices // loop indices
for (i = 0; i < priv.indices.length; i += 1) { for (i = 0; i < priv.indices.length; i += 1) {
...@@ -321,36 +328,39 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -321,36 +328,39 @@ jIO.addStorageType('indexed', function (spec, my) {
index.reference = priv.indices[i]; index.reference = priv.indices[i];
index.reference_size = index.reference.fields.length; index.reference_size = index.reference.fields.length;
// rebuild search_ids for iteration if (current_query_size !== 0) {
if (current_query.query_list === undefined) { // rebuild search_ids for iteration
search_ids.push(current_query.id); if (current_query.query_list === undefined) {
} else { search_ids.push(current_query.id);
for (j = 0; j < current_query.query_list.length; j += 1) { } else {
if (priv.getPositionInArray(current_query.query_list[j].id, for (j = 0; j < current_query.query_list.length; j += 1) {
search_ids) === null) { if (priv.getPositionInArray(current_query.query_list[j].id,
search_ids.push(current_query.query_list[j].id); search_ids) === null) {
search_ids.push(current_query.query_list[j].id);
}
}
}
// loop search ids and find matches in index
for (k = 0; k < search_ids.length; k += 1) {
query_param = search_ids[0];
for (l = 0; l < index.reference_size; l += 1) {
if (query_param === index.reference.fields[l]) {
search_ids.splice(
priv.getPositionInArray(query_param, search_ids),
1
);
}
} }
} }
} }
// rebuild select_ids // rebuild select_ids
for (o = 0; o < syntax.filter.select_list.length; o += 1) { for (o = 0; o < syntax.filter.select_list.length; o += 1) {
element = syntax.filter.select_list[o]; element = syntax.filter.select_list[o];
select_ids[element] = true; select_ids[element] = true;
} }
// loop search ids and find matches in index
for (k = 0; k < search_ids.length; k += 1) {
query_param = search_ids[0];
for (l = 0; l < index.reference_size; l += 1) {
if (query_param === index.reference.fields[l]) {
search_ids.splice(
priv.getPositionInArray(query_param, search_ids),
1
);
}
}
}
// search_ids empty = all needed search fields found on index // search_ids empty = all needed search fields found on index
if (search_ids.length === 0) { if (search_ids.length === 0) {
p = priv.getObjectSize(select_ids); p = priv.getObjectSize(select_ids);
...@@ -915,12 +925,9 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -915,12 +925,9 @@ jIO.addStorageType('indexed', function (spec, my) {
option, option,
function (response) { function (response) {
query_syntax = command.getOption('query'); query_syntax = command.getOption('query');
if (query_syntax !== undefined) { if (query_syntax !== undefined) {
// build complex query object // build complex query object
query_object = priv.constructQueryObject(response, query_syntax); query_object = priv.constructQueryObject(response, query_syntax);
if (query_object.length === 0) { if (query_object.length === 0) {
that.addJob( that.addJob(
"allDocs", "allDocs",
......
...@@ -165,12 +165,16 @@ Object.defineProperty(scope.ComplexQueries,"query",{ ...@@ -165,12 +165,16 @@ Object.defineProperty(scope.ComplexQueries,"query",{
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
result_list = [], result_list_tmp = [], j; result_list = [], result_list_tmp = [], j;
object_list = object_list || []; object_list = object_list || [];
for (j=0; j<object_list.length; ++j) { if (query.query === undefined) {
if ( itemMatchesQuery ( result_list = object_list;
object_list[j], scope.ComplexQueries.parse (query.query) } else {
)) { for (j=0; j<object_list.length; ++j) {
result_list.push(object_list[j]); if ( itemMatchesQuery (
} object_list[j], scope.ComplexQueries.parse (query.query)
)) {
result_list.push(object_list[j]);
}
}
} }
if (query.filter) { if (query.filter) {
select(result_list,query.filter.select_list || []); select(result_list,query.filter.select_list || []);
......
...@@ -1179,6 +1179,38 @@ test ("AllDocs", function(){ ...@@ -1179,6 +1179,38 @@ test ("AllDocs", function(){
}, o.f); }, o.f);
o.tick(o); o.tick(o);
// empty query returns all
o.thisShouldBeTheAnswer5 = [
{"title": "The Good, The Bad and The Ugly"},
{"title": "The Dark Knight"},
{"title": "Star Wars Episode V"},
{"title": "Shawshank Redemption"},
{"title": "Schindlers List"},
{"title": "Pulp Fiction"},
{"title": "One flew over the Cuckoo's Nest"},
{"title": "Lord of the Rings - Return of the King"},
{"title": "Lord Of the Rings - Fellowship of the Ring"},
{"title": "Inception"},
{"title": "Godfellas"},
{"title": "Godfather 2"},
{"title": "Godfather"},
{"title": "Fight Club"},
{"title": "12 Angry Men"}
];
o.spy(o, "value", o.thisShouldBeTheAnswer5,
"allDocs (empty query in complex query)");
o.jio.allDocs({
"query":{
"filter": {
"sort_on":[['title','descending']],
"select_list":['title']
},
"wildcard_character":'%'
}
}, o.f);
o.tick(o);
o.jio.stop(); o.jio.stop();
}); });
...@@ -4693,6 +4725,38 @@ test ("AllDocs Complex Queries", function () { ...@@ -4693,6 +4725,38 @@ test ("AllDocs Complex Queries", function () {
}, o.f); }, o.f);
o.tick(o); o.tick(o);
// empty query returns all
o.thisShouldBeTheAnswer6 = [
{"title": "The Good, The Bad and The Ugly"},
{"title": "The Dark Knight"},
{"title": "Star Wars Episode V"},
{"title": "Shawshank Redemption"},
{"title": "Schindlers List"},
{"title": "Pulp Fiction"},
{"title": "One flew over the Cuckoo's Nest"},
{"title": "Lord of the Rings - Return of the King"},
{"title": "Lord Of the Rings - Fellowship of the Ring"},
{"title": "Inception"},
{"title": "Godfellas"},
{"title": "Godfather 2"},
{"title": "Godfather"},
{"title": "Fight Club"},
{"title": "12 Angry Men"}
];
o.spy(o, "value", o.thisShouldBeTheAnswer6,
"allDocs (empty query in complex query)");
o.jio.allDocs({
"query":{
"filter": {
"sort_on":[['title','descending']],
"select_list":['title']
},
"wildcard_character":'%'
}
}, o.f);
o.tick(o);
o.jio.stop(); o.jio.stop();
}); });
/* /*
......
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