From 645f6b9868d75cf98cf0cadf91f0bdd1dc564571 Mon Sep 17 00:00:00 2001 From: Ilya Tyaptin Date: Thu, 19 Feb 2015 13:29:01 +0300 Subject: [PATCH] [PostgreSQL] Fix regexp operator Add different operators relative to dialect. It's needed to support same regexp format for all backends. Closes-bug: 1423171 Change-Id: I0e732358cff754ae9407ba6b1932bcbe1b1ce1b9 --- ceilometer/alarm/storage/impl_sqlalchemy.py | 4 +++- ceilometer/storage/impl_sqlalchemy.py | 4 +++- ceilometer/storage/sqlalchemy/utils.py | 13 +++++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) 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.'):