|
|
for bve_view in self:
tables_map = {}
select_str = "\n CAST(row_number() OVER ({}) as integer) AS id".format(
bve_view.over_condition or ""
)
for line in bve_view.field_ids:
table = line.table_alias
select = line.field_id.name
as_name = line.name
select_str += f",\n {table}.{select} AS {as_name}"
if line.table_alias not in tables_map:
table = self.env[line.field_id.model_id.model]._table
tables_map[line.table_alias] = table
seen = set()
from_str = ""
if not bve_view.relation_ids and bve_view.field_ids:
first_line = bve_view.field_ids[0]
table = tables_map[first_line.table_alias]
from_str = f"{table} AS {first_line.table_alias}"
for line in bve_view.relation_ids:
table = tables_map[line.table_alias]
table_format = f"{table} AS {line.table_alias}"
if not from_str:
from_str += table_format
seen.add(line.table_alias)
if line.table_alias not in seen:
seen.add(line.table_alias)
join_type = " LEFT" if line.left_join else ""
join_clause = (
f"{join_type} JOIN {table_format} "
f"ON {line.join_node}.id = "
f"{line.table_alias}.{line.field_id.name}"
)
from_str += f"\n{join_clause}"
if line.join_node not in seen:
from_str += "\n"
seen.add(line.join_node)
from_str += " LEFT" if line.left_join else ""
from_str += (
f" JOIN {tables_map[line.join_node]} AS "
f"{line.join_node} "
f"ON {line.table_alias}.{line.field_id.name} = "
f"{line.join_node}.id"
)
bve_view.query = f"""SELECT {select_str}\n\nFROM {from_str}"""
|
|