[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
This commit is contained in:
Ilya Tyaptin 2015-02-19 13:29:01 +03:00
parent 3ad53cc903
commit 645f6b9868
3 changed files with 17 additions and 4 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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.'):