X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FFilter.py;h=42589e046eee7c20b21e2279b5b57576e95523f1;hb=7ff3079ce042525acbf00e0d4fe555e8988c128d;hp=2c512a05bb895372128bab593f3185c99c489bbe;hpb=62670a60343d4a5653976f91d96932edbae11b57;p=plcapi.git diff --git a/PLC/Filter.py b/PLC/Filter.py index 2c512a0..42589e0 100644 --- a/PLC/Filter.py +++ b/PLC/Filter.py @@ -1,5 +1,6 @@ -# $Id$ -# $URL$ +# +# Thierry Parmentelat - INRIA +# from types import StringTypes try: set @@ -211,42 +212,31 @@ class Filter(Parameter, dict): value = "FALSE" clause = "%s %s %s" % (field, operator, value) else: - value = map(str, map(api.db.quote, value)) - do_join = True vals = {} for val in value: base_op, val = get_op_and_val(val) - if base_op != '=': - do_join = False if base_op in vals: vals[base_op].append(val) else: vals[base_op] = [val] - if do_join: - if modifiers['&']: - operator = "@>" - value = "ARRAY[%s]" % ", ".join(value) - elif modifiers['|']: - operator = "&&" - value = "ARRAY[%s]" % ", ".join(value) - else: - operator = "IN" - value = "(%s)" % ", ".join(value) - clause = "%s %s %s" % (field, operator, value) - else: - # We need something more complex - subclauses = [] - for operator in vals.keys(): - if operator == '=': - subclauses.append("(%s IN (%s))" % (field, ",".join(vals[operator]))) - elif operator == 'IS': - subclauses.append("(%s IS NULL)" % field) + subclauses = [] + for operator in vals.keys(): + if operator == '=': + if modifiers['&']: + subclauses.append("(%s @> ARRAY[%s])" % (field, ",".join(vals[operator]))) + elif modifiers['|']: + subclauses.append("(%s && ARRAY[%s])" % (field, ",".join(vals[operator]))) else: - for value in vals[operator]: - subclauses.append("(%s %s %s)" % (field, operator, value)) - clause = "(" + " OR ".join(subclauses) + ")" + subclauses.append("(%s IN (%s))" % (field, ",".join(vals[operator]))) + elif operator == 'IS': + subclauses.append("(%s IS NULL)" % field) + else: + for value in vals[operator]: + subclauses.append("(%s %s %s)" % (field, operator, value)) + clause = "(" + " OR ".join(subclauses) + ")" else: operator, value = get_op_and_val(value) + clause = "%s %s %s" % (field, operator, value) if modifiers['~']: