110 lines
3.7 KiB
Python
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
|