# Thierry Parmentelat <thierry.parmentelat@inria.fr>
from types import StringTypes
-from manifold.core.filter import Filter, Predicate
-from manifold.util.frozendict import frozendict
-from manifold.util.type import returns, accepts
+from manifold.core.filter import Filter, Predicate
+from manifold.util.frozendict import frozendict
+from manifold.util.type import returns, accepts
+from manifold.util.clause import Clause
import copy
import json
#else:
# raise ParameterError, "No valid constructor found for %s : args = %r" % (self.__class__.__name__, args)
- if not self.filters: self.filters = Filter()
- if not self.params: self.params = {}
- if not self.fields: self.fields = set()
- if not self.timestamp: self.timestamp = "now"
+ self.sanitize()
+
+ def sanitize(self):
+ if not self.filters: self.filters = Filter()
+ if not self.params: self.params = {}
+ if not self.fields: self.fields = set()
+ if not self.timestamp: self.timestamp = "now"
if isinstance(self.filters, list):
f = self.filters
for x in f:
pred = Predicate(x)
self.filters.add(pred)
+ elif isinstance(self.filters, Clause):
+ self.filters = Filter.from_clause(self.filters)
if isinstance(self.fields, list):
self.fields = set(self.fields)
self.filters = Filter()
self.params = {}
self.fields = set()
- self.timestamp = "now"
self.timestamp = 'now' # ignored for now
-
def to_sql(self, platform='', multiline=False):
get_params_str = lambda : ', '.join(['%s = %r' % (k, v) for k, v in self.get_params().items()])
get_select_str = lambda : ', '.join(self.get_select())
table = self.get_from()
select = 'SELECT %s' % (get_select_str() if self.get_select() else '*')
where = 'WHERE %s' % self.get_where() if self.get_where() else ''
- at = 'AT %s ' % self.get_timestamp() if self.get_timestamp() else ''
+ at = 'AT %s' % self.get_timestamp() if self.get_timestamp() else ''
params = 'SET %s' % get_params_str() if self.get_params() else ''
sep = ' ' if not multiline else '\n '
if platform: platform = "%s:" % platform
strmap = {
- 'get' : '%(select)s%(sep)s%(at)sFROM %(platform)s%(table)s%(sep)s%(where)s%(sep)s',
+ 'get' : '%(select)s%(sep)s%(at)s%(sep)sFROM %(platform)s%(table)s%(sep)s%(where)s%(sep)s',
'update': 'UPDATE %(platform)s%(table)s%(sep)s%(params)s%(sep)s%(where)s%(sep)s%(select)s',
'create': 'INSERT INTO %(platform)s%(table)s%(sep)s%(params)s%(sep)s%(select)s',
'delete': 'DELETE FROM %(platform)s%(table)s%(sep)s%(where)s'
'action': self.action,
'object': self.object,
'timestamp': self.timestamp,
- 'filters': self.filters,
+ 'filters': self.filters.to_list(),
'params': self.params,
'fields': list(self.fields)
}
if (debug):
import traceback
traceback.print_exc()
+ self.sanitize()
#---------------------------------------------------------------------------
# Accessors
return self
def filter_by(self, *args):
+ """
+ Args:
+ args: It may be:
+ - the parts of a Predicate (key, op, value)
+ - None
+ - a Filter instance
+ - a set/list/tuple of Predicate instances
+ """
if len(args) == 1:
filters = args[0]
if filters == None:
return self
def select(self, *fields):
- if not fields:
- # Delete all fields
- self.fields = set()
- return self
# Accept passing iterables
if len(fields) == 1:
tmp, = fields
- if isinstance(tmp, (list, tuple, set, frozenset)):
+ if not tmp:
+ fields = None
+ elif isinstance(tmp, (list, tuple, set, frozenset)):
fields = tuple(tmp)
+ if not fields:
+ # Delete all fields
+ self.fields = set()
+ return self
+
for field in fields:
self.fields.add(field)
return self