summaryrefslogtreecommitdiff
path: root/heat/db/filters.py
diff options
context:
space:
mode:
Diffstat (limited to 'heat/db/filters.py')
-rw-r--r--heat/db/filters.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/heat/db/filters.py b/heat/db/filters.py
new file mode 100644
index 000000000..6c7b8cf24
--- /dev/null
+++ b/heat/db/filters.py
@@ -0,0 +1,44 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+def exact_filter(query, model, filters):
+ """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
+ """
+
+ filter_dict = {}
+ if filters is None:
+ filters = {}
+
+ for key, value in filters.items():
+ if isinstance(value, (list, tuple, set, frozenset)):
+ column_attr = getattr(model, key)
+ query = query.filter(column_attr.in_(value))
+ else:
+ filter_dict[key] = value
+
+ if filter_dict:
+ query = query.filter_by(**filter_dict)
+
+ return query