def _model_evaluation_get_all_with_filters(context, project_id=None, filters=None, sort_key=None, sort_dir=None): if not sort_key: sort_key = 'created_at' if not sort_dir: sort_dir = 'desc' query = (_model_evaluation_get_query(context).join()) query = query.filter(models.Model_Evaluation.project_id == project_id) # Apply filters if not filters: filters = {} # Apply sorting if sort_dir.lower() not in ('desc', 'asc'): msg = _("Wrong sorting data provided: sort key is '%(sort_key)s' " "and sort direction is '%(sort_dir)s'.") % { "sort_key": sort_key, "sort_dir": sort_dir } raise exception.InvalidInput(reason=msg) def apply_sorting(model_evaluation, query): sort_attr = getattr(model_evaluation, sort_key) sort_method = getattr(sort_attr, sort_dir.lower()) return query.order_by(sort_method()) try: query = apply_sorting(models.Model_Evaluation, query) except AttributeError: msg = _("Wrong sorting key provided - '%s'.") % sort_key raise exception.InvalidInput(reason=msg) # Returns list of model_evaluations that satisfy filters. query = query.all() return query
def exact_filter(query, model, filters, legal_keys): """Applies exact match filtering to a query. Returns the updated query. Modifies filters argument to remove filters consumed. :param query: query to apply filters to :param model: model object the query applies to, for IN-style filtering :param filters: dictionary of filters; values that are lists, tuples, sets, or frozensets cause an 'IN' test to be performed, while exact matching ('==' operator) is used for other values :param legal_keys: list of keys to apply exact filtering to """ filter_dict = {} # Walk through all the keys for key in legal_keys: # Skip ones we're not filtering on if key not in filters: continue # OK, filtering on this key; what value do we search for? value = filters.pop(key) if isinstance(value, (list, tuple, set, frozenset)): # Looking for values in a list; apply to query directly column_attr = getattr(model, key) query = query.filter(column_attr.in_(value)) else: # OK, simple exact match; save for later filter_dict[key] = value # Apply simple exact matches if filter_dict: query = query.filter_by(**filter_dict) return query