def get_elements(self, ids=None, query=None, limit=0, skip=0, sort=None, with_count=False, hint=None, projection=None, tags=None, *args, **kwargs): _query = {} if query is None else query.copy() one_element = isinstance(ids, basestring) if ids is not None: if one_element: _query[MongoStorage.ID] = ids else: _query[MongoStorage.ID] = {'$in': ids} if tags: _query[MongoStorage.TAGS] = tags cursor = self._find(_query, projection) # set limit, skip and sort properties if limit: cursor.limit(limit) if skip: cursor.skip(skip) if sort is not None: sort = Storage._resolve_sort(sort) if sort: cursor.sort(sort) if hint is None: hint = self._get_hint(query=_query, cursor=cursor) if hint is not None: cursor.hint(hint) result = MongoCursor(cursor) if one_element: result = result[0] if result else None # if with_count, add count to the result if with_count: # calculate count count = cursor.count() result = result, count return result
def get_elements( self, ids=None, query=None, limit=0, skip=0, sort=None, with_count=False, hint=None, projection=None, *args, **kwargs ): _query = {} if query is None else query.copy() one_element = isinstance(ids, basestring) if ids is not None: if one_element: _query[MongoStorage.ID] = ids else: _query[MongoStorage.ID] = {"$in": ids} cursor = self._find(_query, projection) # set limit, skip and sort properties if limit: cursor.limit(limit) if skip: cursor.skip(skip) if sort is not None: sort = Storage._resolve_sort(sort) if sort: cursor.sort(sort) if hint is None: hint = self._get_hint(query=_query, cursor=cursor) if hint is not None: cursor.hint(hint) result = MongoCursor(cursor) if one_element: result = result[0] if result else None # if with_count, add count to the result if with_count: # calculate count count = cursor.count() result = result, count return result
def _resolve_sort(sort): """Resolve input sort in transforming it to a list of tuple of (name, direction). :param sort: sort configuration. Can be a string, or :type sort: list of {tuple(str, int), str} :return: depending on type of sort: - str: [(sort, Storage.ASC)] - dict: [(sort['property'], sort.get('direction', Storage.ASC))] - tuple: [(sort[0], sort[1])] - list: - str :rtype: str, dict, tuple or list """ result = [] if isinstance(sort, basestring): result.append((sort, Storage.ASC)) elif isinstance(sort, dict): sort_tuple = None field = sort.get('property', None) if field is not None: direction = sort.get('direction', Storage.ASC) if isinstance(direction, basestring): direction = getattr(Storage, direction.upper()) # Need field property filled in the sort document sort_tuple = (field, direction) if sort_tuple is not None: result.append(sort_tuple) elif isinstance(sort, tuple): direction = sort[1] if isinstance(direction, basestring): direction = getattr(Storage, direction.upper()) result.append((sort[0], direction)) elif isinstance(sort, Iterable): for item in sort: result += Storage._resolve_sort(item) return result
def _resolve_sort(sort): """Resolve input sort in transforming it to a list of tuple of (name, direction). :param sort: sort configuration. Can be a string, or :type sort: list of {tuple(str, int), str} :return: depending on type of sort: - str: [(sort, Storage.ASC)] - dict: [(sort['property'], sort.get('direction', Storage.ASC))] - tuple: [(sort[0], sort[1])] - list: - str :rtype: str, dict, tuple or list """ result = [] if isinstance(sort, basestring): result.append((sort, Storage.ASC)) elif isinstance(sort, dict): sort_tuple = None field = sort.get('property', None) if field is not None: direction = sort.get('direction', Storage.ASC) if isinstance(direction, basestring): direction = getattr(Storage, direction.upper()) # Need field property filled in the sort document sort_tuple = (field, direction) if sort_tuple is not None: result.append(sort_tuple) elif isinstance(sort, tuple): direction = sort[1] if isinstance(direction, basestring): direction = getattr(Storage, direction.upper()) result.append((sort[0], direction)) elif isinstance(sort, Iterable): for item in sort: result += Storage._resolve_sort(item) return result