some improvements in parseFind

This commit is contained in:
rlx 2011-08-23 19:44:29 +00:00
parent b7bbf986e4
commit 64de97e1b5

View file

@ -64,7 +64,9 @@ pandora.Query = (function() {
var selected = ret.query.operator == '|' var selected = ret.query.operator == '|'
? everyCondition(ret.query.conditions, key, '=') ? everyCondition(ret.query.conditions, key, '=')
: oneCondition(ret.query.conditions, key, '='), : oneCondition(ret.query.conditions, key, '='),
query = selected.length ? { query = ret.query;
if (selected.length) {
query = {
conditions: Ox.map(ret.query.conditions, function(condition) { conditions: Ox.map(ret.query.conditions, function(condition) {
var ret; var ret;
if (condition.conditions) { if (condition.conditions) {
@ -74,8 +76,20 @@ pandora.Query = (function() {
} }
return ret; return ret;
}), }),
operator: ret.query.operator operator: ''
} : ret.query; };
if (query.conditions.length == 1) {
if (query.conditions[0].conditions) {
// unwrap single remaining bracketed query
query = {
conditions: query.conditions[0].conditions,
operator: query.conditions[0].operator
}
} else {
query.operator = '';
}
}
}
return { return {
query: query, query: query,
selected: selected selected: selected
@ -83,7 +97,7 @@ pandora.Query = (function() {
}); });
function oneCondition(conditions, key, operator) { function oneCondition(conditions, key, operator) {
// if exactly one condition has the given key and operator // if exactly one condition has the given key and operator
// (including a condition where all subconditions match) // (including conditions where all subconditions match)
// returns the corresponding value(s), otherwise returns [] // returns the corresponding value(s), otherwise returns []
var values = Ox.map(conditions, function(condition) { var values = Ox.map(conditions, function(condition) {
var ret, same; var ret, same;
@ -99,11 +113,12 @@ pandora.Query = (function() {
} }
function everyCondition(conditions, key, operator) { function everyCondition(conditions, key, operator) {
// if every condition has the given key and operator // if every condition has the given key and operator
// (excluding a condition where all subconditions match) // (excluding conditions where all subconditions match)
// returns the corresponding value(s), otherwise returns [] // returns the corresponding value(s), otherwise returns []
return Ox.map(conditions, function(condition) { var values = Ox.map(conditions, function(condition) {
return condition.key == key && condition.operator == operator ? condition.value : null return condition.key == key && condition.operator == operator ? condition.value : null
}); });
return values.length == conditions.length ? values : [];
} }
return ret; return ret;
} }