Files
odoo_source/addons/olap/cube/common.py
T

110 lines
3.7 KiB
Python

import sqlalchemy
from sqlalchemy import *
import common
def measure_sql_exp_col(metadata,col):
temp = col.split(".")
table_name = filter(lambda x: x.name==temp[0],metadata.table_iterator(reverse=False))
if table_name:
if not col in table_name[0].c:
col = sqlalchemy.Column(temp[1], sqlalchemy.Float)
table_name[0].append_column(col)
return col
else:
for k in table_name[0].c:
if temp[1] == k.name:
return k
else:
print "The table %s do not exist or match to cube fact table"%(temp[0])
# To be Improved
# I am sure it exist something better in SA
def col_get(table, col_obj):
# table = sqlalchemy table object
# level = level object
# Check for the columns
datatypes = {
'timestamp': sqlalchemy.DateTime,
'timestampz': sqlalchemy.DateTime,
'numeric': sqlalchemy.Numeric,
'int': sqlalchemy.Integer,
'float8': sqlalchemy.Float,
'varchar': sqlalchemy.String,
'bool': sqlalchemy.Boolean,
'bytea':'Byte A', # Not Clear
'int2':sqlalchemy.SmallInteger,
'int4':sqlalchemy.Integer,
'int8':sqlalchemy.Integer,
'text':sqlalchemy.String,
'date':sqlalchemy.Date,
'time': sqlalchemy.Time,
'number':sqlalchemy.Numeric,
}
if not ('.').join([col_obj.table_id.table_db_name,col_obj.column_db_name]) in table.c:
col = sqlalchemy.Column(col_obj.column_db_name, datatypes[col_obj.type])
table.append_column(col)
return col
else:
for k in table.c:
if col_obj.column_db_name == k.name:
return k
def get_primary_key(table):
for cols in table.columns:
if cols.primary_key == True:
return cols
# It gets the olap_cube_table browse object
def table_get(metadata, table):
result = False
table1 = False
table2 = False
if table.line_ids:
temp = 0
for i in range(len(table.line_ids)):
table1 = sqlalchemy.Table(table.line_ids[i].table_id.table_db_name,metadata)
pk = get_primary_key(table.line_ids[i].table_id)
if result:
result = join(result,table1, onclause=col_get(table1,pk)==col_get(table2,table.line_ids[i-1].field_id))
elif table2:
result = join(table1, table2, onclause=col_get(table1,pk)==col_get(table2,table.line_ids[i-1].field_id))
else:
table2=table1
temp=i
if not result:
result = table1
pk = get_primary_key(table.line_ids[temp].table_id)
tab = sqlalchemy.Table(table.line_ids[temp].field_id.related_to.table_db_name,metadata)
result = join(result, tab,onclause=col_get(tab,pk)
==col_get(sqlalchemy.Table(table.line_ids[temp].table_id.table_db_name,metadata),table.line_ids[temp].field_id))
else:
if table.column_link_id.related_to:
result = sqlalchemy.Table(table.column_link_id.related_to.table_db_name,metadata)
else:
result = sqlalchemy.Table(table.column_link_id.table_id.table_db_name,metadata)
return result
def xcombine(*seqin):
"""
Cartesian product of the list of list that produce all distinct
subsets of my query.
"""
def rloop(seqin,comb):
'''recursive looping function'''
if seqin:
for item in seqin[0]:
newcomb=comb+[item]
for item in rloop(seqin[1:],newcomb):
yield item
else:
yield comb
return rloop(seqin, [])
# vim: ts=4 sts=4 sw=4 si et