Repository: incubator-ariatosca Updated Branches: refs/heads/support_for_sql_opperands [created] 3987e24ad
added support for opperands in sql mapi Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/3987e24a Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/3987e24a Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/3987e24a Branch: refs/heads/support_for_sql_opperands Commit: 3987e24ad67f65004fdd3000d3719548619de825 Parents: e7ffc73 Author: max-orlov <[email protected]> Authored: Tue Apr 4 20:41:59 2017 +0300 Committer: max-orlov <[email protected]> Committed: Tue Apr 4 20:42:17 2017 +0300 ---------------------------------------------------------------------- aria/storage/sql_mapi.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3987e24a/aria/storage/sql_mapi.py ---------------------------------------------------------------------- diff --git a/aria/storage/sql_mapi.py b/aria/storage/sql_mapi.py index 59e1896..d926cac 100644 --- a/aria/storage/sql_mapi.py +++ b/aria/storage/sql_mapi.py @@ -17,6 +17,7 @@ SQLAlchemy based MAPI """ import os import platform +from collections import namedtuple from sqlalchemy import ( create_engine, @@ -31,6 +32,9 @@ from . import ( exceptions, ) +_Operands = namedtuple('Operands', 'ge, gt, lt, le, eq, ne') +OPERANDS = _Operands(ge='__ge__', gt='__gt__', lt='__lt__', le='__le__', eq='__eq__', ne='__ne__') + class SQLAlchemyModelAPI(api.ModelAPI): """ @@ -243,7 +247,10 @@ class SQLAlchemyModelAPI(api.ModelAPI): @staticmethod def _add_value_filter(query, filters): for column, value in filters.items(): - if isinstance(value, (list, tuple)): + if isinstance(value, dict): + op, item = value.items()[0] + query = query.filter(getattr(column, op)(item)) + elif isinstance(value, (list, tuple)): query = query.filter(column.in_(value)) else: query = query.filter(column == value) @@ -269,12 +276,24 @@ class SQLAlchemyModelAPI(api.ModelAPI): include, filters, sort, joins = self._get_joins_and_converted_columns( include, filters, sort ) + filters = self._convert_operands(filters) query = self._get_base_query(include, joins) query = self._filter_query(query, filters) query = self._sort_query(query, sort) return query + @staticmethod + def _convert_operands(filters): + for column, predicate in filters.items(): + if isinstance(predicate, dict): + op, val = predicate.items()[0] + if hasattr(OPERANDS, op): + filters[column][getattr(OPERANDS, op)] = val + del filters[column][op] + + return filters + def _get_joins_and_converted_columns(self, include, filters,
