[FIX] Fixed sql generation bug when the domain ranges on the grandparent's fields of an "inherits" hierarchy.
bzr revid: jth@openerp.com-20100531150517-6q2u5ou30lfe2lqt
This commit is contained in:
parent
758d2f103f
commit
4bd5550e21
|
@ -71,7 +71,8 @@ class expression(object):
|
|||
if not reduce(lambda acc, val: acc and (self._is_operator(val) or self._is_leaf(val)), exp, True):
|
||||
raise ValueError('Bad domain expression: %r' % (exp,))
|
||||
self.__exp = exp
|
||||
self.__tables = {} # used to store the table to use for the sql generation. key = index of the leaf
|
||||
self.__field_tables = {} # used to store the table to use for the sql generation. key = index of the leaf
|
||||
self.__all_tables = set()
|
||||
self.__joins = []
|
||||
self.__main_table = None # 'root' table. set by parse()
|
||||
self.__DUMMY_LEAF = (1, '=', 1) # a dummy leaf that must not be parsed or sql generated
|
||||
|
@ -103,6 +104,7 @@ class expression(object):
|
|||
return [(left, 'in', rg(ids, table, parent or table._parent_name))]
|
||||
|
||||
self.__main_table = table
|
||||
self.__all_tables.add(table)
|
||||
|
||||
i = -1
|
||||
while i + 1<len(self.__exp):
|
||||
|
@ -114,19 +116,17 @@ class expression(object):
|
|||
working_table = table
|
||||
main_table = table
|
||||
fargs = left.split('.', 1)
|
||||
index = i
|
||||
if fargs[0] in table._inherit_fields:
|
||||
while True:
|
||||
field = main_table._columns.get(fargs[0], False)
|
||||
if field:
|
||||
working_table = main_table
|
||||
self.__tables[i] = working_table
|
||||
self.__field_tables[i] = working_table
|
||||
break
|
||||
working_table = main_table.pool.get(main_table._inherit_fields[fargs[0]][0])
|
||||
if working_table not in self.__tables.values():
|
||||
self.__joins.append(('%s.%s=%s.%s' % (working_table._table, 'id', main_table._table, main_table._inherits[working_table._name]), working_table._table))
|
||||
self.__tables[index] = working_table
|
||||
index += 1
|
||||
if working_table not in self.__all_tables:
|
||||
self.__joins.append('%s.%s=%s.%s' % (working_table._table, 'id', main_table._table, main_table._inherits[working_table._name]))
|
||||
self.__all_tables.add(working_table)
|
||||
main_table = working_table
|
||||
|
||||
field = working_table._columns.get(fargs[0], False)
|
||||
|
@ -433,7 +433,7 @@ class expression(object):
|
|||
params = []
|
||||
for i, e in reverse_enumerate(self.__exp):
|
||||
if self._is_leaf(e, internal=True):
|
||||
table = self.__tables.get(i, self.__main_table)
|
||||
table = self.__field_tables.get(i, self.__main_table)
|
||||
q, p = self.__leaf_to_sql(e, table)
|
||||
params.insert(0, p)
|
||||
stack.append(q)
|
||||
|
@ -447,13 +447,13 @@ class expression(object):
|
|||
stack.append('(%s %s %s)' % (q1, ops[e], q2,))
|
||||
|
||||
query = ' AND '.join(reversed(stack))
|
||||
joins = ' AND '.join(map(lambda j: j[0], self.__joins))
|
||||
joins = ' AND '.join(self.__joins)
|
||||
if joins:
|
||||
query = '(%s) AND (%s)' % (joins, query)
|
||||
return (query, flatten(params))
|
||||
|
||||
def get_tables(self):
|
||||
return ['"%s"' % t._table for t in set(self.__tables.values()+[self.__main_table])]
|
||||
return ['"%s"' % t._table for t in self.__all_tables]
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
Loading…
Reference in New Issue