From 61d81c01c497d6ac29ac60d8edb9b4ab88e73be1 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 15 Aug 2013 09:09:19 -0500 Subject: [PATCH] refactoring of belongs, thanks Jonathan --- VERSION | 2 +- gluon/dal.py | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/VERSION b/VERSION index be967c51..cf73e38f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.08.09.16.07.32 +Version 2.6.0-development+timestamp.2013.08.15.09.08.28 diff --git a/gluon/dal.py b/gluon/dal.py index 9ad7bb17..6e7f4431 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -1263,17 +1263,12 @@ class BaseAdapter(ConnectionPool): return '(%s OR %s)' % (self.expand(first), self.expand(second)) def BELONGS(self, first, second): - if isinstance(second, str): - return '(%s IN (%s))' % (self.expand(first), second[:-1]) - if not second: - return '(1=0)' - if isinstance(second, (list,tuple,frozenset)): - second = set(second) # remove duplicates, make mutable - if isinstance(second, set) and None in second: - second.remove(None) - return self.OR(self.EQ(first, None), self.BELONGS(first, second)) - items = ','.join(self.expand(item, first.type) for item in second) - return '(%s IN (%s))' % (self.expand(first), items) + if isinstance(second, str): + return '(%s IN (%s))' % (self.expand(first), second[:-1]) + if not second: + return '(1=0)' + items = ','.join(self.expand(item, first.type) for item in second) + return '(%s IN (%s))' % (self.expand(first), items) def REGEXP(self, first, second): "regular expression operator" @@ -9070,7 +9065,7 @@ class Expression(object): db = self.db return Query(db, db._adapter.REGEXP, self, value) - def belongs(self, *value): + def belongs(self, *value, **kwattr): """ Accepts the following inputs: field.belongs(1,2) @@ -9085,6 +9080,11 @@ class Expression(object): value = value[0] if isinstance(value,Query): value = db(value)._select(value.first._table._id) + elif not isinstance(value, basestring): + value = set(value) + if kwattr.get('null') and None in value: + value.remove(None) + return (self == None) | Query(db, db._adapter.BELONGS, self, value) return Query(db, db._adapter.BELONGS, self, value) def startswith(self, value):