X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FFilter.py;h=9f5fb42befcbfc5e1fadb275fad6548fb31fdc10;hb=a53ee9fc154268bdb4e7d014bba3bd0ac9477c9c;hp=66e9aeeabf2b830759f9c463cf1a23d033fd8c89;hpb=2d7273bf080530720bc072c5eaa213518704d828;p=plcapi.git diff --git a/PLC/Filter.py b/PLC/Filter.py index 66e9aee..9f5fb42 100644 --- a/PLC/Filter.py +++ b/PLC/Filter.py @@ -1,3 +1,10 @@ +from types import StringTypes +try: + set +except NameError: + from sets import Set + set = Set + from PLC.Faults import * from PLC.Parameter import Parameter, Mixed, python_type @@ -36,7 +43,8 @@ class Filter(Parameter, dict): # Accept either a value or a list of values of the specified type self.fields[field] = Mixed(expected, [expected]) - Parameter.__init__(self, self.fields, doc = doc) + # Null filter means no filter + Parameter.__init__(self, self.fields, doc = doc, nullok = True) def sql(self, api, join_with = "AND"): """ @@ -52,6 +60,12 @@ class Filter(Parameter, dict): assert join_with in ("AND", "OR") for field, value in self.iteritems(): + # provide for negation with a field starting with ~ + negation=False + if field[0] == '~': + negation = True + field = field[1:] + if field not in self.fields: raise PLCInvalidArgument, "Invalid filter field '%s'" % field @@ -67,10 +81,18 @@ class Filter(Parameter, dict): if value is None: operator = "IS" value = "NULL" - else: + elif isinstance(value, StringTypes) and \ + (value.find("*") > -1 or value.find("%") > -1): + operator = "LIKE" + value = str(api.db.quote(value.replace("*", "%"))) + else: operator = "=" value = str(api.db.quote(value)) - conditionals.append("%s %s %s" % (field, operator, value)) + clause = "%s %s %s" % (field, operator, value) + if negation: + clause = " ( NOT %s ) "%clause + + conditionals.append(clause) return (" %s " % join_with).join(conditionals)