diff --git a/ceilometer/alarm/storage/impl_sqlalchemy.py b/ceilometer/alarm/storage/impl_sqlalchemy.py index 9ea599892..a6926f26f 100644 --- a/ceilometer/alarm/storage/impl_sqlalchemy.py +++ b/ceilometer/alarm/storage/impl_sqlalchemy.py @@ -105,8 +105,10 @@ class Connection(base.Connection): return [] session = self._engine_facade.get_session() + engine = self._engine_facade.get_engine() query = session.query(table) - transformer = sql_utils.QueryTransformer(table, query) + transformer = sql_utils.QueryTransformer(table, query, + dialect=engine.dialect.name) if filter_expr is not None: transformer.apply_filter(filter_expr) diff --git a/ceilometer/storage/impl_sqlalchemy.py b/ceilometer/storage/impl_sqlalchemy.py index 982898e01..65da829b0 100644 --- a/ceilometer/storage/impl_sqlalchemy.py +++ b/ceilometer/storage/impl_sqlalchemy.py @@ -577,8 +577,10 @@ class Connection(base.Connection): return [] session = self._engine_facade.get_session() + engine = self._engine_facade.get_engine() query = session.query(models.FullSample) - transformer = sql_utils.QueryTransformer(models.FullSample, query) + transformer = sql_utils.QueryTransformer(models.FullSample, query, + dialect=engine.dialect.name) if filter_expr is not None: transformer.apply_filter(filter_expr) diff --git a/ceilometer/storage/sqlalchemy/utils.py b/ceilometer/storage/sqlalchemy/utils.py index 13655c4b2..195396c10 100644 --- a/ceilometer/storage/sqlalchemy/utils.py +++ b/ceilometer/storage/sqlalchemy/utils.py @@ -46,6 +46,10 @@ class QueryTransformer(object): "in": lambda field_name, values: field_name.in_(values), "=~": lambda field, value: field.op("regexp")(value)} + # operators which are differs for different dialects + dialect_operators = {'postgresql': {'=~': (lambda field, value: + field.op("~")(value))}} + complex_operators = {"or": or_, "and": and_, "not": not_} @@ -53,9 +57,14 @@ class QueryTransformer(object): ordering_functions = {"asc": asc, "desc": desc} - def __init__(self, table, query): + def __init__(self, table, query, dialect='mysql'): self.table = table self.query = query + self.dialect_name = dialect + + def _get_operator(self, op): + return (self.dialect_operators.get(self.dialect_name, {}).get(op) + or self.operators[op]) def _handle_complex_op(self, complex_op, nodes): op = self.complex_operators[complex_op] @@ -68,7 +77,7 @@ class QueryTransformer(object): return op(*element_list) def _handle_simple_op(self, simple_op, nodes): - op = self.operators[simple_op] + op = self._get_operator(simple_op) field_name = nodes.keys()[0] value = nodes.values()[0] if field_name.startswith('resource_metadata.'):