+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),
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"):
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
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))