diff -r 59e5cc89e509 -r 797f5ae462e7 app/soc/logic/models/base.py --- a/app/soc/logic/models/base.py Tue Mar 03 23:11:37 2009 +0000 +++ b/app/soc/logic/models/base.py Tue Mar 03 23:27:39 2009 +0000 @@ -268,7 +268,8 @@ raise out_of_band.Error(msg, status=404) - def getForFields(self, filter=None, unique=False, limit=1000, offset=0): + def getForFields(self, filter=None, unique=False, + limit=1000, offset=0, order=None): """Returns all entities that have the specified properties. Args: @@ -276,38 +277,31 @@ unique: if set, only the first item from the resultset will be returned limit: the amount of entities to fetch at most offset: the position to start at + order: a list with the sort order """ + if not filter: + filter = {} if unique: limit = 1 + if not order: + order = [] - if filter: - format_eq = '%(key)s = :%(num)d' - format_in = '%(key)s IN (%(values)s)' + orderset = set([i.strip('-') for i in order]) + if len(orderset) != len(order): + raise InvalidArgumentError - n = 1 - conditionals = [] - args = [] + q = db.Query(self._model) - for key, value in filter.iteritems(): - if isinstance(value, list): - count = len(value) - args.extend(value) - values = ', '.join([':%d' % i for i in range(n, n + count)]) - sub = format_in % {'key': key, 'values': values} - n = n + count - else: - sub = format_eq % {'key': key, 'num': n} - args.append(value) - n = n + 1 - conditionals.append(sub) + for key, value in filter.iteritems(): + if isinstance(value, list): + op = '%s IN' % key + q.filter(op, value) + else: + q.filter(key, value) - joined_pairs = ' AND '.join(conditionals) - condition = 'WHERE ' + joined_pairs - - q = self._model.gql(condition, *args) - else: - q = self._model.all() + for key in order: + q.order(key) result = q.fetch(limit, offset)