Author: tmckay
Date: 2013-12-20 16:40:19 +0000 (Fri, 20 Dec 2013)
New Revision: 5790
Modified:
branches/statusquo/cumin/python/cumin/main.py
branches/statusquo/rosemary/python/rosemary/sqlfilter.py
Log:
Fixes BZ1022727
Modified: branches/statusquo/cumin/python/cumin/main.py
===================================================================
--- branches/statusquo/cumin/python/cumin/main.py 2013-12-20 16:37:53 UTC (rev 5789)
+++ branches/statusquo/cumin/python/cumin/main.py 2013-12-20 16:40:19 UTC (rev 5790)
@@ -542,9 +542,7 @@
self.adapter.vhost_id_field = ObjectSqlField \
(self.adapter, self.cls.vhostRef)
- filter = SqlComparisonFilter(self.cls.msgDepth.sql_column,
- "null",
- "is not")
+ filter = SqlNullFilter(self.cls.msgDepth.sql_column)
self.adapter.query.add_filter(filter)
def render_rows(self, session):
@@ -588,9 +586,7 @@
def init(self):
super(TopSystemTable, self).init()
- filter = SqlComparisonFilter(self.cls.loadAverage1Min.sql_column,
- "null",
- "is not")
+ filter = SqlNullFilter(self.cls.loadAverage1Min.sql_column)
self.adapter.query.add_filter(filter)
class TopSubmissionTable(TopTable):
Modified: branches/statusquo/rosemary/python/rosemary/sqlfilter.py
===================================================================
--- branches/statusquo/rosemary/python/rosemary/sqlfilter.py 2013-12-20 16:37:53 UTC (rev
5789)
+++ branches/statusquo/rosemary/python/rosemary/sqlfilter.py 2013-12-20 16:40:19 UTC (rev
5790)
@@ -5,7 +5,18 @@
class SqlFilter(object):
pass
-class SqlComparisonFilter(SqlFilter):
+class SqlOpFilter(SqlFilter):
+ def __init__(self, operator, *ops):
+ self.operator = operator
+ self.valid_operators = ops
+ self.check_operator()
+
+ def check_operator(self):
+ if self.valid_operators and not self.operator in self.valid_operators:
+ raise Exception("Operator '%s' is not in the valid set %s"
%
+ (self.operator, self.valid_operators))
+
+class SqlComparisonFilter(SqlOpFilter):
'''
Emit a comparison filter for a SQL query.
@@ -32,16 +43,16 @@
def __init__(self, this, that,
operator="=",
gen_cursor=None,
- mogrify=(False,False,True)):
+ mogrify=(False,False,True),
+
valid_operators=("<",">","=","<=",">=")):
- super(SqlComparisonFilter, self).__init__()
+ super(SqlComparisonFilter, self).__init__(operator, *valid_operators)
assert isinstance(operator, str)
assert len(mogrify) == 3
self.this = getattr(this, "identifier", this)
self.that = getattr(that, "identifier", that)
- self.operator = operator
self.gen_cursor = gen_cursor
self.mogrify = mogrify
@@ -61,6 +72,7 @@
return cursor.mogrify(pattern, vals)
def emit(self):
+ self.check_operator()
if self.gen_cursor and True in self.mogrify:
return self._mogrify()
@@ -68,43 +80,50 @@
self.operator,
self.that)
+class SqlNullFilter(SqlComparisonFilter):
+ def __init__(self, this):
+ super(SqlNullFilter, self).__init__(this,
+ "null",
+ "is not",
+ valid_operators=("is not",))
+
class SqlValueFilter(SqlComparisonFilter):
- def __init__(self, this, operator="="):
+ def __init__(self, this, operator="=",
valid_operators=("<",">","=","<=",">=")):
that = "%%(%s)s" % this.name
- super(SqlValueFilter, self).__init__(this, that, operator)
+ super(SqlValueFilter, self).__init__(this, that, operator,
+ valid_operators=valid_operators)
-class SqlExistenceFilter(SqlFilter):
- def __init__(self, subquery, operator="exists"):
- super(SqlExistenceFilter, self).__init__()
-
- self.subquery = subquery
- self.operator = operator
-
- def emit(self):
- return "%s (%s)" % (self.operator, self.subquery)
-
class SqlLikeFilter(SqlValueFilter):
BEGINS = "B"
CONTAINS = "C"
def __init__(self, this, operator="like"):
- super(SqlLikeFilter, self).__init__(this, operator)
+ super(SqlLikeFilter, self).__init__(this, operator,
valid_operators=("like",))
class SqlILikeFilter(SqlValueFilter):
BEGINS = "B"
CONTAINS = "C"
def __init__(self, this, operator="ilike"):
- super(SqlILikeFilter, self).__init__(this, operator)
+ super(SqlILikeFilter, self).__init__(this, operator,
valid_operators=("ilike",))
+class SqlExistenceFilter(SqlOpFilter):
+ def __init__(self, subquery, operator="exists"):
+ super(SqlExistenceFilter, self).__init__(operator, "exists")
-class SqlDateValueFilter(SqlFilter):
+ self.subquery = subquery
+
+ def emit(self):
+ self.check_operator()
+ return "%s (%s)" % (self.operator, self.subquery)
+
+class SqlDateValueFilter(SqlOpFilter):
def __init__(self, this, that, operator="="):
- super(SqlDateValueFilter, self).__init__()
+ super(SqlDateValueFilter, self).__init__(operator,
"<",">","=","<=",">=")
assert isinstance(operator, str)
self.this = getattr(this, "identifier", this)
self.that = getattr(that, "identifier", that)
- self.operator = operator
def emit(self):
- return "%s %s date('%s')" % (self.this, self.operator,
self.that)
\ No newline at end of file
+ self.check_operator()
+ return "%s %s date('%s')" % (self.this, self.operator,
self.that)