This commit was manufactured by cvs2svn to create branch
[plcapi.git] / PLC / Filter.py
index 4ed819b..49990c6 100644 (file)
@@ -1,11 +1,19 @@
+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
 
 class Filter(Parameter, dict):
     """
     A type of parameter that represents a filter on one or more
-    columns of a database table. fields should be a dictionary of
-    field names and types, e.g.
+    columns of a database table.
+
+    field should be a dictionary of field names and types, e.g.
 
     {'node_id': Parameter(int, "Node identifier"),
      'hostname': Parameter(int, "Fully qualified hostname", max = 255),
@@ -17,6 +25,14 @@ class Filter(Parameter, dict):
     representing an intersection (if join_with is AND) or union (if
     join_with is OR) filter. If a value is a sequence type, then it
     should represent a list of possible values for that field.
+
+    Special forms:
+    * a field starting with the ~ character means negation.
+    example :  { '~peer_id' : None }
+    * a (string) value containing either a * or a % character is
+      treated as a (sql) pattern; * are replaced with % that is the
+      SQL wildcard character.
+    example :  { 'hostname' : '*.jp' } 
     """
 
     def __init__(self, fields = {}, filter = {}, doc = "Attribute filter"):
@@ -55,9 +71,9 @@ class Filter(Parameter, dict):
         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[0] == '~':
+                negation = True
+                field = field[1:]
 
             if field not in self.fields:
                 raise PLCInvalidArgument, "Invalid filter field '%s'" % field
@@ -74,8 +90,8 @@ class Filter(Parameter, dict):
                 if value is None:
                     operator = "IS"
                     value = "NULL"
-                elif not isinstance(value, bool) \
-               and (value.find("*") > -1 or value.find("%") > -1):
+                elif isinstance(value, StringTypes) and \
+                     (value.find("*") > -1 or value.find("%") > -1):
                    operator = "LIKE"
                     value = str(api.db.quote(value.replace("*", "%")))
                else: