bug fixesy
This commit is contained in:
+6
-4
@@ -143,8 +143,8 @@ class TableInfo:
|
||||
|
||||
def get_col_d(self, col_name):
|
||||
col = self.columns_byname[col_name]
|
||||
if type(self.rec) is list:
|
||||
self.rec.append(col)
|
||||
if type(self.rec) is set:
|
||||
self.rec.add(col)
|
||||
return col
|
||||
|
||||
def get_ccolname_d(self, col_name):
|
||||
@@ -167,12 +167,12 @@ class TableInfo:
|
||||
self.alias.add(alias)
|
||||
|
||||
def parse_tablenames(self, colExpr, materialize = True, raw = False):
|
||||
self.get_col = self.get_col if materialize else self.get_col_d
|
||||
# get_col = self.get_col if materialize else self.get_col_d
|
||||
|
||||
parsedColExpr = colExpr.split('.')
|
||||
ret = None
|
||||
if len(parsedColExpr) <= 1:
|
||||
ret = self.get_col(colExpr)
|
||||
ret = self.get_col_d(colExpr)
|
||||
else:
|
||||
datasource = self.cxt.tables_byname[parsedColExpr[0]]
|
||||
if datasource is None:
|
||||
@@ -184,6 +184,7 @@ class TableInfo:
|
||||
if self.groupinfo is not None and ret and ret in self.groupinfo.raw_groups:
|
||||
string = f'get<{self.groupinfo.raw_groups.index(ret)}>({{y}})'
|
||||
return string, ret if raw else string
|
||||
|
||||
class View:
|
||||
def __init__(self, context, table = None, tmp = True):
|
||||
self.table: TableInfo = table
|
||||
@@ -200,6 +201,7 @@ class Context:
|
||||
extern "C" int __DLLEXPORT__ dllmain(Context* cxt) {
|
||||
using namespace std;
|
||||
using namespace types;
|
||||
|
||||
'''
|
||||
def __init__(self):
|
||||
self.tables:List[TableInfo] = []
|
||||
|
||||
+13
-37
@@ -89,43 +89,19 @@ class outfile(ast_node):
|
||||
out_table:TableInfo = self.parent.out_table
|
||||
filename = node['loc']['literal'] if 'loc' in node else node['literal']
|
||||
sep = ',' if 'term' not in node else node['term']['literal']
|
||||
self.context.headers.add('fstream')
|
||||
cout_backup_buffer = 'stdout_' + base62uuid(4)
|
||||
ofstream = 'ofstream_' + base62uuid(6)
|
||||
|
||||
self.emit(f'auto {cout_backup_buffer} = cout.rdbuf();')
|
||||
self.emit(f'auto {ofstream} = ofstream("{filename}");')
|
||||
self.emit(f'cout.rdbuf({ofstream}.rdbuf());')
|
||||
|
||||
self.emit_no_ln(f"\"{filename}\"1:`csv@(+(")
|
||||
l_compound = False
|
||||
l_cols = ''
|
||||
l_keys = ''
|
||||
ending = lambda x: x[:-1] if len(x) > 0 and x[-1]==';' else x
|
||||
for i, c in enumerate(out_table.columns):
|
||||
c:ColRef
|
||||
l_keys += '`' + c.name
|
||||
if c.compound:
|
||||
if l_compound:
|
||||
l_cols=f'flatBOTH\'+(({ending(l_cols)});{c.cname})'
|
||||
else:
|
||||
l_compound = True
|
||||
if i >= 1:
|
||||
l_cols = f'flatRO\'+(({ending(l_cols)});{c.cname})'
|
||||
else:
|
||||
l_cols = c.cname + ';'
|
||||
elif l_compound:
|
||||
l_cols = f'flatLO\'+(({ending(l_cols)});{c.cname})'
|
||||
else:
|
||||
l_cols += f"{c.cname};"
|
||||
if not l_compound:
|
||||
self.emit_no_ln(l_keys + '!(' + ending(l_cols) + ')')
|
||||
else:
|
||||
self.emit_no_ln(f'{l_keys}!+,/({ending(l_cols)})')
|
||||
self.emit('))')
|
||||
|
||||
self.emit(f'cout.rdbuf({cout_backup_buffer});')
|
||||
self.emit(f'{ofstream}.close();')
|
||||
file_pointer = 'fp_' + base62uuid(6)
|
||||
self.emit(f'FILE* {file_pointer} = fopen("{filename}", "w");')
|
||||
self.emit(f'{out_table.cxt_name}->printall("{sep}", "\\n", nullptr, {file_pointer});')
|
||||
self.emit(f'fclose({file_pointer});')
|
||||
# self.context.headers.add('fstream')
|
||||
# cout_backup_buffer = 'stdout_' + base62uuid(4)
|
||||
# ofstream = 'ofstream_' + base62uuid(6)
|
||||
# self.emit(f'auto {cout_backup_buffer} = cout.rdbuf();')
|
||||
# self.emit(f'auto {ofstream} = ofstream("{filename}");')
|
||||
# self.emit(f'cout.rdbuf({ofstream}.rdbuf());')
|
||||
# TODO: ADD STMTS.
|
||||
# self.emit(f'cout.rdbuf({cout_backup_buffer});')
|
||||
# self.emit(f'{ofstream}.close();')
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
+11
-6
@@ -11,10 +11,10 @@ class expr(ast_node):
|
||||
'avg': 'avg',
|
||||
'sum': 'sum',
|
||||
'count' : 'count',
|
||||
'mins': ['mins', 'minsw'],
|
||||
'maxs': ['maxs', 'maxsw'],
|
||||
'avgs': ['avgs', 'avgsw'],
|
||||
'sums': ['sums', 'sumsw'],
|
||||
'mins': ['mins', 'minw'],
|
||||
'maxs': ['maxs', 'maxw'],
|
||||
'avgs': ['avgs', 'avgw'],
|
||||
'sums': ['sums', 'sumw'],
|
||||
}
|
||||
|
||||
binary_ops = {
|
||||
@@ -47,6 +47,9 @@ class expr(ast_node):
|
||||
self.materialize_cols = materialize_cols
|
||||
self.raw_col = None
|
||||
self.__abs = abs_col
|
||||
self.inside_agg = False
|
||||
if(type(parent) is expr):
|
||||
self.inside_agg = parent.inside_agg
|
||||
ast_node.__init__(self, parent, node, None)
|
||||
|
||||
def init(self, _):
|
||||
@@ -67,7 +70,8 @@ class expr(ast_node):
|
||||
if type(node) is dict:
|
||||
for key, val in node.items():
|
||||
if key in self.func_maps:
|
||||
# if type(val) in [dict, str]:
|
||||
# TODO: distinguish between UDF agg functions and other UDF functions.
|
||||
self.inside_agg = True
|
||||
self.context.headers.add('"./server/aggregations.h"')
|
||||
if type(val) is list and len(val) > 1:
|
||||
cfunc = self.func_maps[key]
|
||||
@@ -81,6 +85,7 @@ class expr(ast_node):
|
||||
self._expr += f"{funcname}("
|
||||
self._expr += expr(self, val)._expr
|
||||
self._expr += ')'
|
||||
self.inside_agg = False
|
||||
elif key in self.binary_ops:
|
||||
l = expr(self, val[0])._expr
|
||||
r = expr(self, val[1])._expr
|
||||
@@ -112,7 +117,7 @@ class expr(ast_node):
|
||||
self._expr, self.raw_col = self.datasource.parse_tablenames(node, self.materialize_cols, True)
|
||||
self.raw_col = self.raw_col if type(self.raw_col) is ColRef else None
|
||||
if self.__abs and self.raw_col:
|
||||
self._expr = self.raw_col.reference() + index_expr
|
||||
self._expr = self.raw_col.reference() + ("" if self.inside_agg else index_expr)
|
||||
elif type(node) is bool:
|
||||
self._expr = '1' if node else '0'
|
||||
else:
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ class groupby(ast_node):
|
||||
self.group_type = 'record_type' + base62uuid(7)
|
||||
self.datasource = self.parent.datasource
|
||||
self.scanner = None
|
||||
self.datasource.rec = []
|
||||
self.datasource.rec = set()
|
||||
self.raw_groups = []
|
||||
def produce(self, node):
|
||||
|
||||
|
||||
+19
-8
@@ -4,7 +4,7 @@ from engine.join import join
|
||||
from engine.expr import expr
|
||||
from engine.orderby import orderby
|
||||
from engine.scan import filter
|
||||
from engine.utils import base62uuid, enlist, base62alp
|
||||
from engine.utils import base62uuid, enlist, base62alp, has_other
|
||||
from engine.ddl import create_table, outfile
|
||||
import copy
|
||||
|
||||
@@ -88,26 +88,39 @@ class projection(ast_node):
|
||||
for i, proj in enumerate(self.projections):
|
||||
cname = ''
|
||||
compound = False
|
||||
self.datasource.rec = []
|
||||
self.datasource.rec = set()
|
||||
if type(proj) is dict:
|
||||
if 'value' in proj:
|
||||
e = proj['value']
|
||||
sname = expr(self, e)._expr
|
||||
fname = expr.toCExpr(sname) # fastest access method at innermost context
|
||||
absname = expr(self, e, abs_col=True)._expr # absolute name at function scope
|
||||
compound = True
|
||||
compound = True # compound column
|
||||
cexprs.append(fname)
|
||||
cname = e if type(e) is str else ''.join([a if a in base62alp else '' for a in expr.toCExpr(absname)()])
|
||||
if 'name' in proj: # renaming column by AS keyword
|
||||
cname = proj['name']
|
||||
new_names.append(cname)
|
||||
compound = compound and has_groupby and self.datasource.rec not in self.group_node.referenced
|
||||
elif type(proj) is str:
|
||||
col = self.datasource.get_col_d(proj)
|
||||
if type(col) is ColRef:
|
||||
col.reference()
|
||||
|
||||
compound = compound and has_groupby and has_other(self.datasource.rec, self.group_node.referenced)
|
||||
self.datasource.rec = None
|
||||
|
||||
typename = ''
|
||||
if not compound:
|
||||
typename = f'value_type<decays<decltype({absname})>>'
|
||||
else :
|
||||
typename = f'decays<decltype({absname})>'
|
||||
|
||||
cols.append(ColRef(cname, expr.toCExpr(typename)(), self.out_table, 0, None, cname, i, compound=compound))
|
||||
|
||||
cols.append(ColRef(cname, expr.toCExpr(f'decays<decltype({absname})>')(0), self.out_table, 0, None, cname, i, compound=compound))
|
||||
self.out_table.add_cols(cols, False)
|
||||
|
||||
if has_groupby:
|
||||
create_table(self, self.out_table)
|
||||
create_table(self, self.out_table) # only initializes out_table.
|
||||
self.group_node.finalize(cexprs, self.out_table)
|
||||
else:
|
||||
create_table(self, self.out_table, cexpr = cexprs)
|
||||
@@ -129,8 +142,6 @@ class projection(ast_node):
|
||||
|
||||
|
||||
if flatten:
|
||||
if len(self.projections) > 1 and not self.inv:
|
||||
self.emit(f"{disp_varname}:+{disp_varname}")
|
||||
outfile(self, node['outfile'])
|
||||
|
||||
if self.datasource_changed:
|
||||
|
||||
+7
-1
@@ -16,4 +16,10 @@ def enlist(l):
|
||||
return l if type(l) is list else [l]
|
||||
|
||||
def seps(s, i, l):
|
||||
return s if i < len(l) - 1 else ''
|
||||
return s if i < len(l) - 1 else ''
|
||||
|
||||
def has_other(a, b):
|
||||
for ai in a:
|
||||
if ai not in b:
|
||||
return True
|
||||
return False
|
||||
Reference in New Issue
Block a user