From f3762595a8b592f8445c3ce333573a45c376abf2 Mon Sep 17 00:00:00 2001 From: bill sun Date: Sat, 16 Apr 2022 03:35:20 +0800 Subject: [PATCH] Bug fixes on assumptions. Other improvements. --- Makefile.old | 8 - README.md | 36 ++++- csv.dylib | Bin 37784 -> 0 bytes engine/ast.py | 21 ++- engine/ddl.py | 86 ++++++----- engine/expr.py | 25 +-- engine/groupby.py | 25 ++- engine/orderby.py | 59 +++---- engine/projection.py | 119 +++++++++----- engine/scan.py | 49 ++++-- engine/utils.py | 8 +- header.k | 68 -------- join.k | 1 - libcsv.a | Bin 483998 -> 0 bytes mmw.dylib | Bin 66520 -> 0 bytes mmw.so | Bin 31200 -> 0 bytes moving_avg.a | 2 +- msc-plugin/lineage.hpp | 5 + msc-plugin/msc-plugin.vcxproj | 4 + msvs-py/msvs-py.pyproj | 93 +++++++++++ out.cpp | 103 +++++++------ out_attempt1.cpp | 60 +++++++ out_working.cpp | 46 ------ prompt.py | 15 +- q1.sql | 2 +- server/aggregations.h | 84 ++++++++-- server/io.h | 15 ++ server/priority_vector.hpp | 19 +++ server/server.cpp | 5 +- server/server.sln | 20 ++- server/server.vcxproj | 26 ++-- server/table.h | 283 +++++++++++++++++++++++++++++----- server/types.cpp | 5 - server/types.h | 91 +++++++++-- server/utils.h | 28 ++-- server/vector_type.cpp | 10 ++ server/vector_type.hpp | 29 +++- stock.a | 16 +- 38 files changed, 1030 insertions(+), 436 deletions(-) delete mode 100644 Makefile.old delete mode 100644 csv.dylib delete mode 100644 header.k delete mode 100644 join.k delete mode 100644 libcsv.a delete mode 100644 mmw.dylib delete mode 100644 mmw.so create mode 100644 msc-plugin/lineage.hpp create mode 100644 msvs-py/msvs-py.pyproj create mode 100644 out_attempt1.cpp delete mode 100644 out_working.cpp create mode 100644 server/io.h create mode 100644 server/priority_vector.hpp diff --git a/Makefile.old b/Makefile.old deleted file mode 100644 index fef8c50..0000000 --- a/Makefile.old +++ /dev/null @@ -1,8 +0,0 @@ -all: - g++ mmw.cpp --std=c++1z -shared -fPIC -Ofast -march=native -g0 -s -o mmw.so -avx512: - g++ mmw.cpp --std=c++1z -shared -fPIC -Ofast -mavx512f -g0 -s -o mmw.so -debug: - g++ mmw.cpp --std=c++1z -shared -fPIC -O0 -march=native -g3 -o mmw.so -clean: - rm mmw.so -rf diff --git a/README.md b/README.md index f1c753b..e6cec8f 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,44 @@ -# AQuery++ +# AQuery++ DB +## Introduction -AQuery++ Compiler that compiles AQuery into C++11. -Frontend built on top of [mo-sql-parsing](https://github.com/klahnakoski/mo-sql-parsing). +AQuery++ Database is a cross-platform, In-Memory Column-Store Database that incorporates compiled query execution. +Compiler frontend built on top of [mo-sql-parsing](https://github.com/klahnakoski/mo-sql-parsing). ## Roadmap - [x] SQL Parser -> AQuery Parser (Front End) - [ ] AQuery-C++ Compiler (Back End) - [x] Schema and Data Model - [x] Data acquisition/output from/to csv file - - [ ] Single table queries + - [x] Single table queries - [x] Projections and Single Table Aggregations - [x] Group by Aggregations - [x] Filters - - [ ] Order by - - [ ] Assumption + - [x] Order by + - [x] Assumption + - [x] Flatten - [ ] Multi-table - [ ] Join - [ ] Subqueries - [ ] -> Optimizing Compiler + +## TODO: +- [ ] C++ Meta-Programming: Elimilate template recursions as much as possible. +- [ ] IPC: Better ways to communicate between Interpreter (Python) and Executer (C++). + - [ ] Sockets? stdin/stdout capture? + +## Requirements +Recent version of Linux, Windows or MacOS, with recent C++ compiler that has C++17 (1z) support (e.g. gcc 6.0, MSVC 2017, clang 6.0), and python 3.6 or above. + +## Usage +`python3 prompt.py` will launch the interactive command prompt. The server binary will be autometically rebuilt and started. +#### Commands: +- ``: parse sql statement +- `f `: parse all sql statements in file +- `print`: printout parsed sql statements +- `exec`: execute last parsed statement(s) +- `r`: run the last generated code snippet +- `save `: save current code snippet. will use random filename if not specified. +- `exit`: quit the prompt +#### Example: + `f moving_avg.a`
+ `exec` \ No newline at end of file diff --git a/csv.dylib b/csv.dylib deleted file mode 100644 index 3dc33e4f338242f8d485f594e61c0296e2251264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37784 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[{self.table_name}]);') + self.cxt.emit(f'auto& {base_name} = *(TableInfo{type_tags} *)(cxt->tables["{self.table_name}"]);') + return self.cxt_name def refer_all(self): self.reference() for c in self.columns: @@ -110,7 +114,10 @@ class TableInfo: self.cxt.ccols_byname[cname] = col_object self.columns_byname[c['name']] = col_object self.columns.append(col_object) - + def get_size(self): + size_tmp = 'tmp_sz_'+base62uuid(6) + self.cxt.emit(f'const auto& {size_tmp} = {self.columns[0].reference()}.size;') + return size_tmp @property def n_cols(self): return len(self.columns) @@ -136,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): @@ -160,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: @@ -177,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 @@ -193,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] = [] diff --git a/engine/ddl.py b/engine/ddl.py index b3e9f3a..60be2be 100644 --- a/engine/ddl.py +++ b/engine/ddl.py @@ -1,14 +1,17 @@ # code-gen for data decl languages +from engine.orderby import orderby from engine.ast import ColRef, TableInfo, ast_node, Context, include +from engine.scan import scan from engine.utils import base62uuid class create_table(ast_node): name = 'create_table' - def __init__(self, parent: "ast_node", node, context: Context = None, cexpr = None): - self.cexpr = cexpr + def __init__(self, parent: "ast_node", node, context: Context = None, cexprs = None, lineage = False): + self.cexprs = cexprs + self.lineage = lineage super().__init__(parent, node, context) - def produce(self, node): + def produce(self, node): if type(node) is not TableInfo: ct = node[self.name] tbl = self.context.add_table(ct['name'], ct['columns']) @@ -22,14 +25,38 @@ class create_table(ast_node): self.context.tables_in_context[tbl] = tbl.table_name tbl.cxt_name = tbl.table_name tbl.refer_all() - if self.cexpr is None: + # create an empty new table + if self.cexprs is None: for c in tbl.columns: self.emit(f"{c.cxt_name}.init();") + # create an output table else: - for i, c in enumerate(tbl.columns): - self.emit(f"{c.cxt_name}.init();") - self.emit(f"{c.cxt_name} = {self.cexpr[i]()};") - + # 1 to 1 lineage. + if len(self.context.scans) == 0: + if self.lineage: + order = 'order_' + base62uuid(6) + self.emit(f'auto {order} = {self.parent.datasource.cxt_name}->order_by<{orderby(self.parent, self.parent.assumptions).result()}>();') + self.lineage = '*' + order + else: + self.lineage = None + for i, c in enumerate(tbl.columns): + self.emit(f"{c.cxt_name}.init();") + self.emit(f"{c.cxt_name} = {self.cexprs[i](self.lineage)};") + self.lineage = None + self.parent.assumptions = None + else: + scanner:scan = self.context.scans[-1] + if self.lineage: + lineage_var = 'lineage_' + base62uuid(6) + counter_var = 'counter_' + base62uuid(6) + scanner.add(f'auto {lineage_var} = {self.datasource.cxt_name}->bind({tbl.cxt_name});', "init") + scanner.add(f'auto {counter_var} = 0;', "init") + scanner.add(f"{lineage_var}.emplace_back({counter_var}++);", "front") + self.lineage = f"{lineage_var}.rid" + for i, c in enumerate(tbl.columns): + scanner.add(f"{c.cxt_name}.init();", "init") + scanner.add(f"{c.cxt_name} = {self.cexprs[i](scanner.it_ver)};") + class insert(ast_node): name = 'insert' def produce(self, node): @@ -81,32 +108,21 @@ class outfile(ast_node): def produce(self, node): out_table:TableInfo = self.parent.out_table filename = node['loc']['literal'] if 'loc' in node else node['literal'] - 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('))') - + sep = ',' if 'term' not in node else node['term']['literal'] + 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 include(sys.modules[__name__]) \ No newline at end of file diff --git a/engine/expr.py b/engine/expr.py index ae9769f..b387d79 100644 --- a/engine/expr.py +++ b/engine/expr.py @@ -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 = { @@ -23,8 +23,8 @@ class expr(ast_node): 'mul':'*', 'div':'/', 'mod':'%', - 'and':'&', - 'or':'|', + 'and':'&&', + 'or':'||', 'xor' : '^', 'gt':'>', 'lt':'<', @@ -40,13 +40,16 @@ class expr(ast_node): 'not' : '!' } - coumpound_generating_ops = ['mod', 'mins', 'maxs', 'sums'] + \ + coumpound_generating_ops = ['avgs', 'mins', 'maxs', 'sums'] + \ list( binary_ops.keys()) + list(compound_ops.keys()) + list(unary_ops.keys() ) def __init__(self, parent, node, materialize_cols = True, abs_col = False): 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 @@ -92,7 +97,7 @@ class expr(ast_node): x.append(expr(self, v)._expr) self._expr = self.compound_ops[key][1](x) elif key in self.unary_ops: - self._expr += f'({expr(self, val)._expr}{self.unary_ops[key]})' + self._expr += f'{self.unary_ops[key]}({expr(self, val)._expr})' else: print(f'Undefined expr: {key}{val}') @@ -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: diff --git a/engine/groupby.py b/engine/groupby.py index 62a4e69..3a23c34 100644 --- a/engine/groupby.py +++ b/engine/groupby.py @@ -1,8 +1,9 @@ -from engine.ast import TableInfo, ast_node +from engine.ast import ColRef, TableInfo, ast_node +from engine.orderby import assumption from engine.scan import scan from engine.utils import base62uuid from engine.expr import expr -import engine.types + class groupby(ast_node): name = '_groupby' def init(self, _): @@ -12,7 +13,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): @@ -24,7 +25,8 @@ class groupby(ast_node): for i, g in enumerate(node): v = g['value'] e = expr(self, v) - self.raw_groups.append(e.raw_col) + if type(e.raw_col) is ColRef: + self.raw_groups.append(e.raw_col) e = e._expr # if v is compound expr, create tmp cols if type(v) is not str: @@ -40,7 +42,7 @@ class groupby(ast_node): self.emit(f'unordered_map<{self.group_type}, vector_type, ' f'transTypes<{self.group_type}, hasher>> {self.group};') self.n_grps = len(node) - self.scanner = scan(self, None, expr.toCExpr(first_col)()+'.size') + self.scanner = scan(self, self.datasource, expr.toCExpr(first_col)()+'.size') self.scanner.add(f'{self.group}[forward_as_tuple({g_contents(self.scanner.it_ver)})].emplace_back({self.scanner.it_ver});') @@ -48,7 +50,14 @@ class groupby(ast_node): self.referenced = self.datasource.rec self.datasource.rec = None self.scanner.finalize() - + + def deal_with_assumptions(self, assumption:assumption, out:TableInfo): + gscanner = scan(self, self.group) + val_var = 'val_'+base62uuid(7) + gscanner.add(f'auto &{val_var} = {gscanner.it_ver}.second;') + gscanner.add(f'{out.cxt_name}->order_by<{assumption.result()}>(&{val_var});') + gscanner.finalize() + def finalize(self, cexprs, out:TableInfo): gscanner = scan(self, self.group) key_var = 'key_'+base62uuid(7) @@ -58,4 +67,6 @@ class groupby(ast_node): gscanner.add(f'auto &{val_var} = {gscanner.it_ver}.second;') gscanner.add(';\n'.join([f'{out.columns[i].reference()}.emplace_back({ce(x=val_var, y=key_var)})' for i, ce in enumerate(cexprs)])+';') - gscanner.finalize() \ No newline at end of file + gscanner.finalize() + + self.datasource.groupinfo = None \ No newline at end of file diff --git a/engine/orderby.py b/engine/orderby.py index ae410d4..99e4ab5 100644 --- a/engine/orderby.py +++ b/engine/orderby.py @@ -16,43 +16,50 @@ class order_item: return ('' if self.order else '-') + f'({self.name})' def __str__(self): - return self.materialize() + return self.name def __repr__(self): return self.__str__() -class orders: - def __init__(self, node, datasource): - self.order_items = [] - self.materialized = False - self.view = None - self.node = node - self.datasource = datasource - self.n_attrs = -1 - - def materialize(self): - if not self.materialized: - self.view = View(self.node.context, self.datasource, False) - keys = ';'.join([f'{o}' for o in self.order_items]) - self.n_attrs = len(self.order_items) - self.node.emit(f"{self.view.name}: > +`j (({',' if self.n_attrs == 1 else ''}{keys}))") - self.materialized = True - - def append(self, o): - self.order_items.append(o) - class orderby(ast_node): name = '_orderby' - + def __init__(self, parent: "ast_node", node, context: Context = None): + self.col_list = [] + super().__init__(parent, node, context) def init(self, _): self.datasource = self.parent.datasource - self.order = orders(self, self.datasource) + self.order = [] self.view = '' def produce(self, node): if type(node) is not list: node = [node] for n in node: order = not ('sort' in n and n['sort'] == 'desc') - self.order.append(order_item(n['value'], self, order)) + col_id = self.datasource.columns_byname[n['value']].id + col_id = col_id if order else -col_id-1 + if col_id not in self.col_list: + self.col_list.append(col_id) + self.order.append(order_item(n['value'], self, order)) + + def merge(self, node): + self.produce(node) + + def finialize(self, references): + self.order = [ o for o in self.order if o.name in references ] + + def result(self, sep:str = ','): + return sep.join([f"{c}" for c in self.col_list]) - def consume(self, _): - self.datasource.order.append(self.order) \ No newline at end of file +class assumption(orderby): + name = '_assumption' + def __init__(self, parent: "ast_node", node, context: Context = None, exclude = []): + self.exclude = exclude + super().__init__(parent, node, context) + + def produce(self, node): + if type(node) is not list: + node = [node] + [n for n in node if n not in self.exclude] + return super().produce(node) + + def empty(self): + return len(self.col_list) == 0 \ No newline at end of file diff --git a/engine/projection.py b/engine/projection.py index 088bde0..11c613a 100644 --- a/engine/projection.py +++ b/engine/projection.py @@ -2,9 +2,9 @@ from engine.ast import ColRef, TableInfo, ast_node, Context, include from engine.groupby import groupby from engine.join import join from engine.expr import expr -from engine.orderby import orderby +from engine.orderby import assumption, 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 @@ -14,6 +14,8 @@ class projection(ast_node): self.disp = disp self.outname = outname self.group_node = None + self.assumptions = None + self.where = None ast_node.__init__(self, parent, node, context) def init(self, _): if self.outname is None: @@ -44,9 +46,8 @@ class projection(ast_node): elif type(value) is str: self.datasource = self.context.tables_byname[value] if 'assumptions' in from_clause: - for assumption in enlist(from_clause['assumptions']): - orderby(self, assumption) - + self.assumptions = enlist(from_clause['assumptions']) + elif type(from_clause) is str: self.datasource = self.context.tables_byname[from_clause] @@ -58,8 +59,9 @@ class projection(ast_node): self.prev_datasource = self.context.datasource self.context.datasource = self.datasource if 'where' in node: - self.datasource = filter(self, node['where'], True).output - self.context.datasource = self.datasource + self.where = filter(self, node['where'], True) + # self.datasource = filter(self, node['where'], True).output + # self.context.datasource = self.datasource if 'groupby' in node: self.group_node = groupby(self, node['groupby']) @@ -71,62 +73,101 @@ class projection(ast_node): def consume(self, node): self.inv = True disp_varname = 'd'+base62uuid(7) - has_groupby = False - if self.group_node is not None: - # There is group by; - has_groupby = True + has_groupby = self.group_node is not None cexprs = [] flatten = False cols = [] self.out_table = TableInfo('out_'+base62uuid(4), [], self.context) if 'outfile' in node: flatten = True - + + new_names = [] + proj_raw_cols = [] 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) - absname = expr(self, e, abs_col=True)._expr - compound = True + sname = expr(self, e) + if type(sname.raw_col) is ColRef: + proj_raw_cols.append(sname.raw_col) + sname = sname._expr + fname = expr.toCExpr(sname) # fastest access method at innermost context + absname = expr(self, e, abs_col=True)._expr # absolute name at function scope + # TODO: Make it single pass here. + compound = True # compound column cexprs.append(fname) - cname = ''.join([a if a in base62alp else '' for a in fname()]) - - compound = compound and has_groupby and self.datasource.rec not in self.group_node.referenced + 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) + 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 = f'decays' + if not compound: + typename = f'value_type<{typename}>' + + cols.append(ColRef(cname, expr.toCExpr(typename)(), self.out_table, 0, None, cname, i, compound=compound)) - cols.append(ColRef(cname, expr.toCExpr(f'decays')(0), self.out_table, 0, None, cname, i, compound=compound)) self.out_table.add_cols(cols, False) + lineage = None + if has_groupby: - create_table(self, self.out_table) + create_table(self, self.out_table) # creates empty out_table. + if self.assumptions is not None: + self.assumptions = assumption(self, self.assumptions, exclude=self.group_node.raw_groups) + if not self.assumptions.empty(): + self.group_node.deal_with_assumptions(self.assumptions, self.out_table) + self.assumptions = None self.group_node.finalize(cexprs, self.out_table) else: - create_table(self, self.out_table, cexpr = cexprs) - self.datasource.group_node = None - - has_orderby = 'orderby' in node - - if has_orderby: + # if all assumptions in projections, treat as orderby + lineage = self.assumptions is not None and has_other(self.assumptions, proj_raw_cols) + spawn = create_table(self, self.out_table, cexprs = cexprs, lineage = lineage) # create and populate out_table. + if lineage and type(spawn.lineage) is str: + lineage = spawn.lineage + self.assumptions = orderby(self, self.assumptions) # do not exclude proj_raw_cols + else: + lineage = None + if self.where is not None: + self.where.finalize() + + if type(lineage) is str: + order = 'order_' + base62uuid(6) + self.emit(f'auto {order} = {self.datasource.cxt_name}->order_by<{self.assumptions.result()}>({lineage});') + self.emit(f'{self.out_table.cxt_name}->materialize(*{order});') + self.assumptions = None + + if self.assumptions is not None: + orderby_node = orderby(self, self.assumptions) + else: + orderby_node = None + + if 'orderby' in node: self.datasource = self.out_table self.context.datasource = self.out_table # discard current ds - orderby_node = orderby(self, node['orderby']) - self.context.datasource.materialize_orderbys() - self.emit_no_ln(f"{f'{disp_varname}:+' if flatten else ''}(") + orderbys = node['orderby'] + orderby_node = orderby(self, orderbys) if orderby_node is None else orderby_node.merge(orderbys) + + if orderby_node is not None: + self.emit(f'auto {disp_varname} = {self.out_table.reference()}->order_by_view<{orderby_node.result()}>();') + else: + disp_varname = f'*{self.out_table.cxt_name}' - if self.disp or has_orderby: - self.emit(f'print(*{self.out_table.cxt_name});') + if self.disp: + self.emit(f'print({disp_varname});') - if has_orderby: - self.emit(f')[{orderby_node.view}]') - else: - self.context.emit_flush() + 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: diff --git a/engine/scan.py b/engine/scan.py index 4766d7a..812165e 100644 --- a/engine/scan.py +++ b/engine/scan.py @@ -5,16 +5,20 @@ from engine.expr import expr class scan(ast_node): name = 'scan' - def __init__(self, parent: "ast_node", node, size = None, context: Context = None): + def __init__(self, parent: "ast_node", node, size = None, context: Context = None, const = False): self.type = type self.size = size + self.const = "const " if const else "" super().__init__(parent, node, context) def init(self, _): self.datasource = self.context.datasource + self.initializers = '' self.start = '' + self.front = '' self.body = '' self.end = '}' - self.filter = None + self.mode = None + self.filters = [] scan_vars = set(s.it_var for s in self.context.scans) self.it_ver = 'i' + base62uuid(2) while(self.it_ver in scan_vars): @@ -22,19 +26,33 @@ class scan(ast_node): self.parent.context.scans.append(self) def produce(self, node): if type(node) is ColRef: + self.colref = node if self.size is None: - self.start += f'for (auto& {self.it_ver} : {node.reference()}) {{\n' + self.mode = ["col", node.table] + self.start += f'for ({self.const}auto& {self.it_ver} : {node.reference()}) {{\n' else: + self.mode = ["idx", node.table] self.start += f"for (uint32_t {self.it_ver} = 0; {self.it_ver} < {node.reference()}.size; ++{self.it_ver}){{\\n" elif type(node) is str: - self.start+= f'for(auto& {self.it_ver} : {node}) {{\n' + self.mode = ["idx", None] + self.start+= f'for({self.const}auto& {self.it_ver} : {node}) {{\n' else: + self.mode = ["idx", node] # Node is the TableInfo self.start += f"for (uint32_t {self.it_ver} = 0; {self.it_ver} < {self.size}; ++{self.it_ver}){{\n" - def add(self, stmt): - self.body+=stmt + '\n' + def add(self, stmt, position = "body"): + if position == "body": + self.body += stmt + '\n' + elif position == "init": + self.initializers += stmt + '\n' + else: + self.front += stmt + '\n' + def finalize(self): - self.context.remove_scan(self, self.start + self.body + self.end) + for f in self.filters: + self.start += f + self.end += '}' + self.context.remove_scan(self, self.initializers + self.start + self.front + self.body + self.end) class filter(ast_node): name = 'filter' @@ -45,7 +63,7 @@ class filter(ast_node): self.datasource = self.context.datasource self.view = View(self.context, self.datasource) self.value = None - + def spawn(self, node): # TODO: deal with subqueries self.modified_node = node @@ -64,9 +82,18 @@ class filter(ast_node): self.emit(f'{tmpVar}:{self.value}') for o, c in zip(self.output.columns, self.datasource.columns): self.emit(f'{o.cname}:$[{tmpVar};{c.cname};()]') - - def consume(self, node): + + def finalize(self): + self.scanner.finalize() + def consume(self, _): # TODO: optimizations after converting expr to cnf + self.scanner = None + for s in self.context.scans: + if self.datasource == s.mode[1]: + self.scanner = s + break + if self.scanner is None: + self.scanner = scan(self, self.datasource, self.datasource.get_size()) self.expr = expr(self, self.modified_node) - print(node) + self.scanner.filters.append(f'if ({self.expr.cexpr(self.scanner.it_ver)}) {{\n') \ No newline at end of file diff --git a/engine/utils.py b/engine/utils.py index 283a80f..5a7c427 100644 --- a/engine/utils.py +++ b/engine/utils.py @@ -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 '' \ No newline at end of file + 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 \ No newline at end of file diff --git a/header.k b/header.k deleted file mode 100644 index 7be225d..0000000 --- a/header.k +++ /dev/null @@ -1,68 +0,0 @@ -import`csv - -md:{y-x*_y%x} - -maxs:{[L]{max(x, y)}\L} -mins:{[L]{min(x, y)}\L} -sums:{[L]{(x + y)}\L} - -avgsimpl:{[L;i] curr:L[i]%(i+1); $[i<(#L)-1;curr, avgsimpl[L;i+1];curr]} -avgs:{[L] avgsimpl[sums[L];0]} - -/ maxswimp:{[L;w;i] curr:max(L@(((i-w)+!w)|0)); $[i<#L;curr, maxswimp[L; w; i + 1];curr]} -/ maxsw:{[w;L]maxswimp[L; w; 1]} - -/ minswimp:{[L;w;i] curr:min(L@(((i-w)+!w)|0)); $[i<#L;curr, maxswimp[L; w; i + 1];curr]} -/ minsw:{[w;L]minswimp[L;w;1]} - -/ avgswimp:{[L;w;s;i] s:(s+L[i])-L[i-w];curr:s%((i+1)&w);$[i<(#L)-1; curr, avgswimp[L; w; s; i+1]; curr]} -/ avgsw:{[w;L] avgswimp[L;w;0;0]} - -/ sumswimp:{[L;w;s;i] s:(s+L[i])-L[i-w];$[i<(#L)-1; s, sumswimp[L; w; s; i+1]; s]} -/ sumsw:{[w;L] sumswimp[L;w;0;0]} - - -groupby0:{[L] - {[x;y] - x:$[(@x)=`i;(,(L[0]))!,(,0);x]; - k:(,(L[y]));gvk:x[k][0]; - found:$[(gvk[0]+gvk[1])>0;1;L[y] in !x]; - cg:(,L[y])!$[found;,gvk[0],y;,(,y)]; - (x,cg)}/!(#L)} - -groupBy:{[x]groupBySingle:{[a;x] - findAll:{[c;xx] - f:{[i;c]$[(c[0])[i]~c[1];i+1;0]}; - @[!#xx;!#xx;f;(#xx)#,(xx;c)]}; - z:findAll[a;x]; - b:(findAll[0;z]_(!(1+#z)))-1;(a;b)}; - x:+x;y:?x; - @[y;!#y;groupBySingle;(#y)#,x]} - -groupby:{[L] - L:^+L; - dimy:(#(L[0]))-1; - ((({[L;dim;x;y] - x:$[x~0;(,(dim#(L[0])),0);x]; - curr:dim#(L[y]); - $[(dim#*x)~curr;x;((,curr,y),x)]}[L;dimy])/!(#L));(+L)[dimy]) } - -lststr:{[L](+({[x;y] ($x,$y)}/L))[0]} -delist:{[L] $[(@L)in(`LL`LC`LG`L);delist[(,/L)];L]} -cntlist:{[L;i] $[(@L)in(`LL`LC`LG`L);cntlist[(,/L);i+1];i+1]} -flatRO:{[x]x[0],/:x[1]} -flatLO:{[x]x[0],\:x[1]} -flatBOTH:{[x],/(x[0],/:\:x[1])} - - -sumswkrl:{[L;w;x;y] ((x-L[y-w])+L[y])} -sumsw:{[w;L] $[(#L)=0;L;(sumswkrl[L;w])\@[!#L;0;L[file 0]]]} -avgswkrl:{[L;w;x;y] (x-(L[y-w]-L[y])%w)} -avgsw:{[w;L] $[(#L)=0;L;(avgswkrl[L;w])\@[!#L;0;L[0]]]} - -/ minsw:{[w;L] ({[L;w;x] min(L[$[x>w;(!w) + ((x-w)+1);!(x+1)]])}[L;w])'!#L} -import`mmw -minsw:{[w;L] ret:L; mmw[ret;((`g ($@ret)[0]), (#ret), w, 65536)];ret} -maxsw:{[w;L] ret:L; mmw[ret;((`g ($@ret)[0]), (#ret), w, 65537)];ret} -minswip:{[w;L] mmw[L;((`g ($@L)[0]), (#L), w, 65536)];} -maxswip:{[w;L] mmw[L;((`g ($@L)[0]), (#L), w, 65537)];} \ No newline at end of file diff --git a/join.k b/join.k deleted file mode 100644 index 0a220d8..0000000 --- a/join.k +++ /dev/null @@ -1 +0,0 @@ -{[I;L;R;i] t:&(I[i]);d:(#t);$[d=0;!0;+(Aa[t];Ab[t];d#(Bb[i]))]}[(Aa {x>(y*10)}/: Ba); Aa; Ba]'!#Aa \ No newline at end of file diff --git a/libcsv.a b/libcsv.a deleted file mode 100644 index 036fac94299225a2d8649cfa94250363e6a17134..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483998 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 EU#!f*SO5S3 diff --git a/moving_avg.a b/moving_avg.a index 2d4d5fa..f9b21e5 100644 --- a/moving_avg.a +++ b/moving_avg.a @@ -8,7 +8,7 @@ SELECT Month,avgs(3,sales) FROM sale ASSUMING ASC Month INTO OUTFILE "moving_avg_output.csv" -FIELDS TERMINATED BY "," +FIELDS TERMINATED BY ";" select sales, mins(2,Month) from sale group by sales into outfile "flatten.csv" \ No newline at end of file diff --git a/msc-plugin/lineage.hpp b/msc-plugin/lineage.hpp new file mode 100644 index 0000000..cb20820 --- /dev/null +++ b/msc-plugin/lineage.hpp @@ -0,0 +1,5 @@ +#pragma once +template +struct lineage { + +}; \ No newline at end of file diff --git a/msc-plugin/msc-plugin.vcxproj b/msc-plugin/msc-plugin.vcxproj index 78d05a4..682cfb8 100644 --- a/msc-plugin/msc-plugin.vcxproj +++ b/msc-plugin/msc-plugin.vcxproj @@ -93,6 +93,7 @@ true _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpplatest Console @@ -108,6 +109,7 @@ true _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpplatest Console @@ -123,6 +125,7 @@ true _CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpplatest Console @@ -138,6 +141,7 @@ true _CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpplatest Console diff --git a/msvs-py/msvs-py.pyproj b/msvs-py/msvs-py.pyproj new file mode 100644 index 0000000..b2fdde2 --- /dev/null +++ b/msvs-py/msvs-py.pyproj @@ -0,0 +1,93 @@ + + + Debug + 2.0 + ccc243f5-663e-45b7-a6de-b2468c58b3a7 + . + + + ..\msvs-py + . + . + msvs-py + msvs-py + + + true + false + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/out.cpp b/out.cpp index 8e4f407..03d68f4 100644 --- a/out.cpp +++ b/out.cpp @@ -1,60 +1,61 @@ +#include "./server/hasher.h" #include "./server/aggregations.h" +#include "csv.h" #include "./server/libaquery.h" +#include extern "C" int __DLLEXPORT__ dllmain(Context* cxt) { using namespace std; using namespace types; - auto stocks = new TableInfo("stocks", 2); -cxt->tables.insert({"stocks", stocks}); -auto& stocks_timestamp = *(ColRef *)(&stocks->colrefs[0]); -auto& stocks_price = *(ColRef *)(&stocks->colrefs[1]); -stocks_timestamp.init(); -stocks_price.init(); -stocks_timestamp.emplace_back(1); -stocks_price.emplace_back(15); -stocks_timestamp.emplace_back(2); -stocks_price.emplace_back(19); -stocks_timestamp.emplace_back(3); -stocks_price.emplace_back(16); -stocks_timestamp.emplace_back(4); -stocks_price.emplace_back(17); -stocks_timestamp.emplace_back(5); -stocks_price.emplace_back(15); -stocks_timestamp.emplace_back(6); -stocks_price.emplace_back(13); -stocks_timestamp.emplace_back(7); -stocks_price.emplace_back(5); -stocks_timestamp.emplace_back(8); -stocks_price.emplace_back(8); -stocks_timestamp.emplace_back(9); -stocks_price.emplace_back(7); -stocks_timestamp.emplace_back(10); -stocks_price.emplace_back(13); -stocks_timestamp.emplace_back(11); -stocks_price.emplace_back(11); -stocks_timestamp.emplace_back(12); -stocks_price.emplace_back(14); -stocks_timestamp.emplace_back(13); -stocks_price.emplace_back(10); -stocks_timestamp.emplace_back(14); -stocks_price.emplace_back(5); -stocks_timestamp.emplace_back(15); -stocks_price.emplace_back(2); -stocks_timestamp.emplace_back(16); -stocks_price.emplace_back(5); -auto out_ZPYh = new TableInfo>("out_ZPYh", 1); -cxt->tables.insert({"out_ZPYh", out_ZPYh}); -auto& out_ZPYh_maxstockspriceminstockstimestamp = *(ColRef> *)(&out_ZPYh->colrefs[0]); -out_ZPYh_maxstockspriceminstockstimestamp.init(); -out_ZPYh_maxstockspriceminstockstimestamp = max((stocks_price-min(stocks_timestamp))); -print(*out_ZPYh); - -auto out_1ac3 = new TableInfo>("out_1ac3", 1); -cxt->tables.insert({"out_1ac3", out_1ac3}); -auto& out_1ac3_maxstockspriceminsstocksprice = *(ColRef> *)(&out_1ac3->colrefs[0]); -out_1ac3_maxstockspriceminsstocksprice.init(); -out_1ac3_maxstockspriceminsstocksprice = max((stocks_price-mins(stocks_price))); -print(*out_1ac3); + + auto sale = new TableInfo("sale", 2); +cxt->tables.insert({"sale", sale}); +auto& sale_Month = *(ColRef *)(&sale->colrefs[0]); +auto& sale_sales = *(ColRef *)(&sale->colrefs[1]); +sale_Month.init(); +sale_sales.init(); +io::CSVReader<2> csv_reader_6T89Ll("moving_avg.csv"); +csv_reader_6T89Ll.read_header(io::ignore_extra_column, "Month","sales"); +int tmp_5vttJ2yV; +int tmp_2ckq15YU; +while(csv_reader_6T89Ll.read_row(tmp_5vttJ2yV,tmp_2ckq15YU)) { +sale_Month.emplace_back(tmp_5vttJ2yV); +sale_sales.emplace_back(tmp_2ckq15YU); +} +auto out_2UiD = new TableInfo>,value_type>>("out_2UiD", 2); +cxt->tables.insert({"out_2UiD", out_2UiD}); +auto& out_2UiD_Month = *(ColRef>> *)(&out_2UiD->colrefs[0]); +auto& out_2UiD_avgw3salesales = *(ColRef>> *)(&out_2UiD->colrefs[1]); +auto order_1NNZ9F = sale->order_by<0>(); +out_2UiD_Month.init(); +out_2UiD_Month = sale_Month[*order_1NNZ9F]; +out_2UiD_avgw3salesales.init(); +out_2UiD_avgw3salesales = avgw(3,sale_sales[*order_1NNZ9F]); +print(*out_2UiD); +FILE* fp_6xIJn4 = fopen("moving_avg_output.csv", "w"); +out_2UiD->printall(";", "\n", nullptr, fp_6xIJn4); +fclose(fp_6xIJn4); +typedef record record_type6Lepq5T; +unordered_map, transTypes> g4loWjmn; +for (uint32_t i5g = 0; i5g < sale_sales.size; ++i5g){ +g4loWjmn[forward_as_tuple(sale_sales[i5g])].emplace_back(i5g); +} +auto out_2YlO = new TableInfo>,decays>("out_2YlO", 2); +cxt->tables.insert({"out_2YlO", out_2YlO}); +auto& out_2YlO_sales = *(ColRef>> *)(&out_2YlO->colrefs[0]); +auto& out_2YlO_minw2saleMonth = *(ColRef> *)(&out_2YlO->colrefs[1]); +out_2YlO_sales.init(); +out_2YlO_minw2saleMonth.init(); +for(auto& iFU : g4loWjmn) { +auto &key_3AwvKMR = iFU.first; +auto &val_7jtE12E = iFU.second; +out_2YlO_sales.emplace_back(get<0>(key_3AwvKMR)); +out_2YlO_minw2saleMonth.emplace_back(minw(2,sale_Month[val_7jtE12E])); +} +print(*out_2YlO); +FILE* fp_45ld6S = fopen("flatten.csv", "w"); +out_2YlO->printall(",", "\n", nullptr, fp_45ld6S); +fclose(fp_45ld6S); return 0; } \ No newline at end of file diff --git a/out_attempt1.cpp b/out_attempt1.cpp new file mode 100644 index 0000000..de6ffb3 --- /dev/null +++ b/out_attempt1.cpp @@ -0,0 +1,60 @@ +#include "./server/libaquery.h" +#include +#include "./server/hasher.h" +#include "csv.h" +#include "./server/aggregations.h" + + extern "C" int __DLLEXPORT__ dllmain(Context* cxt) { + using namespace std; + using namespace types; + + auto sale = new TableInfo("sale", 2); +cxt->tables.insert({"sale", sale}); +auto& sale_Month = *(ColRef *)(&sale->colrefs[0]); +auto& sale_sales = *(ColRef *)(&sale->colrefs[1]); +sale_Month.init(); +sale_sales.init(); +io::CSVReader<2> csv_reader_53ychC("moving_avg.csv"); +csv_reader_53ychC.read_header(io::ignore_extra_column, "Month","sales"); +int tmp_7ttMnHd3; +int tmp_5nHjeAtP; +while(csv_reader_53ychC.read_row(tmp_7ttMnHd3,tmp_5nHjeAtP)) { + +sale_Month.emplace_back(tmp_7ttMnHd3); +sale_sales.emplace_back(tmp_5nHjeAtP); +} +auto out_3Xio = new TableInfo,decays>("out_3Xio", 2); +cxt->tables.insert({"out_3Xio", out_3Xio}); +auto& out_3Xio_Month = *(ColRef> *)(&out_3Xio->colrefs[0]); +auto& out_3Xio_avgsw3salesales = *(ColRef> *)(&out_3Xio->colrefs[1]); +out_3Xio_Month.init(); +out_3Xio_Month = sale_Month; +out_3Xio_avgsw3salesales.init(); +out_3Xio_avgsw3salesales = avgw(3,sale_sales); +// print(*out_3Xio); +FILE* fp_4nKGhD = fopen("moving_avg_output.csv", "w"); +out_3Xio->printall(",", "\n", nullptr, fp_4nKGhD); +fclose(fp_4nKGhD); +typedef record record_type1H2vDGL; +unordered_map, transTypes> g6Mjxfk5; +for (uint32_t i7u = 0; i7u < sale_sales.size; ++i7u){ +g6Mjxfk5[forward_as_tuple(sale_sales[i7u])].emplace_back(i7u); +} +auto out_2IU2 = new TableInfo,decays>("out_2IU2", 2); +cxt->tables.insert({"out_2IU2", out_2IU2}); +auto& out_2IU2_sales = *(ColRef> *)(&out_2IU2->colrefs[0]); +auto& out_2IU2_minsw2saleMonth = *(ColRef> *)(&out_2IU2->colrefs[1]); +out_2IU2_sales.init(); +out_2IU2_minsw2saleMonth.init(); +for(auto& i5J : g6Mjxfk5) { +auto &key_4jl5toH = i5J.first; +auto &val_VJGwVwH = i5J.second; +out_2IU2_sales.emplace_back(get<0>(key_4jl5toH)); +out_2IU2_minsw2saleMonth.emplace_back(minw(2,sale_Month[val_VJGwVwH])); +} +// print(*out_2IU2); +FILE* fp_18R4fY = fopen("flatten.csv", "w"); +out_2IU2->printall(",","\n", nullptr, fp_18R4fY); +fclose(fp_18R4fY); +return 0; +} \ No newline at end of file diff --git a/out_working.cpp b/out_working.cpp deleted file mode 100644 index 5fbb369..0000000 --- a/out_working.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "./server/libaquery.h" -#include -#include -extern "C" int dllmain(Context *cxt) -{ - auto stocks = new TableInfo("stocks", 2); - cxt->tables.insert(std::make_pair("stocks", stocks)); - stocks->colrefs[0].ty = types::AINT; - stocks->colrefs[1].ty = types::AINT; - auto &stocks_0 = *(ColRef *)(&stocks->colrefs[0]); - auto &stocks_1 = *(ColRef *)(&stocks->colrefs[1]); - stocks_0.emplace_back(1); - stocks_1.emplace_back(15); - stocks_0.emplace_back(2); - stocks_1.emplace_back(19); - stocks_0.emplace_back(3); - stocks_1.emplace_back(16); - stocks_0.emplace_back(4); - stocks_1.emplace_back(17); - stocks_0.emplace_back(5); - stocks_1.emplace_back(15); - stocks_0.emplace_back(6); - stocks_1.emplace_back(13); - stocks_0.emplace_back(7); - stocks_1.emplace_back(5); - stocks_0.emplace_back(8); - stocks_1.emplace_back(8); - stocks_0.emplace_back(9); - stocks_1.emplace_back(7); - stocks_0.emplace_back(10); - stocks_1.emplace_back(13); - stocks_0.emplace_back(11); - stocks_1.emplace_back(11); - stocks_0.emplace_back(12); - stocks_1.emplace_back(14); - stocks_0.emplace_back(13); - stocks_1.emplace_back(10); - stocks_0.emplace_back(14); - stocks_1.emplace_back(5); - stocks_0.emplace_back(15); - stocks_1.emplace_back(2); - stocks_0.emplace_back(16); - stocks_1.emplace_back(5); - printf("%d\n", max(stocks_0 - min(stocks_1))); - return 0; -} \ No newline at end of file diff --git a/prompt.py b/prompt.py index 9333997..e956c3a 100644 --- a/prompt.py +++ b/prompt.py @@ -1,6 +1,8 @@ from concurrent.futures import thread import re import time + +from mo_parsing import ParseException import aquery_parser as parser import engine import subprocess @@ -90,6 +92,8 @@ cxt = None while test_parser: try: if server.poll() is not None: + mm.seek(0,os.SEEK_SET) + mm.write(b'\x01\x00') server = subprocess.Popen(["./server.bin", shm]) q = input() if q == 'exec': @@ -126,6 +130,15 @@ while test_parser: mm.seek(0,os.SEEK_SET) mm.write(b'\x01\x01') continue + elif q.startswith('save'): + filename = re.split(' |\t', q) + if (len(filename) > 1): + filename = filename[1] + else: + filename = f'out_{base62uuid(4)}.cpp' + with open(filename, 'wb') as outfile: + outfile.write((cxt.finalize()).encode('utf-8')) + continue trimed = ws.sub(' ', q.lower()).split(' ') if trimed[0].startswith('f'): fn = 'stock.a' if len(trimed) <= 1 or len(trimed[1]) == 0 \ @@ -137,7 +150,7 @@ while test_parser: continue stmts = parser.parse(q) print(stmts) - except (ValueError, FileNotFoundError) as e: + except (ValueError, FileNotFoundError, ParseException) as e: rm() print(type(e), e) diff --git a/q1.sql b/q1.sql index bd6d5fd..360dc2f 100644 --- a/q1.sql +++ b/q1.sql @@ -7,4 +7,4 @@ FIELDS TERMINATED BY "," SELECT sum(c), b, d FROM test group by a,b,d --- order by d DESC, b ASC +order by d DESC, b ASC diff --git a/server/aggregations.h b/server/aggregations.h index 71de8aa..7a5accc 100644 --- a/server/aggregations.h +++ b/server/aggregations.h @@ -39,10 +39,10 @@ T min(const VT& v) { return min_v; } template class VT> -VT mins(const VT& arr) { - const int& len = arr.size; +decayed_t mins(const VT& arr) { + const uint32_t& len = arr.size; std::deque> cache; - VT ret(len); + decayed_t ret(len); T min = std::numeric_limits::max(); for (int i = 0; i < len; ++i) { if (arr[i] < min) @@ -52,9 +52,9 @@ VT mins(const VT& arr) { return ret; } template class VT> -VT maxs(const VT& arr) { - const int& len = arr.size; - VT ret(len); +decayed_t maxs(const VT& arr) { + const uint32_t& len = arr.size; + decayed_t ret(len); T max = std::numeric_limits::min(); for (int i = 0; i < len; ++i) { if (arr[i] > max) @@ -65,9 +65,9 @@ VT maxs(const VT& arr) { } template class VT> -VT minw(const VT& arr, uint32_t w) { - const int& len = arr.size; - VT ret(len); +decayed_t minw(uint32_t w, const VT& arr) { + const uint32_t& len = arr.size; + decayed_t ret{len}; std::deque> cache; for (int i = 0; i < len; ++i) { if (!cache.empty() && cache.front().second == i - w) cache.pop_front(); @@ -79,9 +79,9 @@ VT minw(const VT& arr, uint32_t w) { } template class VT> -VT maxw(const VT& arr, uint32_t w) { - const int& len = arr.size; - VT ret(len); +decayed_t maxw(uint32_t w, const VT& arr) { + const uint32_t& len = arr.size; + decayed_t ret(len); std::deque> cache; for (int i = 0; i < len; ++i) { if (!cache.empty() && cache.front().second == i - w) cache.pop_front(); @@ -92,14 +92,66 @@ VT maxw(const VT& arr, uint32_t w) { return ret; } +template class VT> +decayed_t> sums(const VT& arr) { + const uint32_t& len = arr.size; + decayed_t> ret(len); + uint32_t i = 0; + if(len) ret[i++] = arr[0]; + for (; i < len; ++i) + ret[i] = ret[i-1] + arr[i]; + return ret; +} +template class VT> +decayed_t> avgs(const VT& arr) { + const uint32_t& len = arr.size; + typedef types::GetFPType FPType; + decayed_t ret(len); + uint32_t i = 0; + types::GetLongType s; + if(len) s = ret[i++] = arr[0]; + for (; i < len; ++i) + ret[i] = (s+=arr[i])/(FPType)(i+1); + return ret; +} +template class VT> +decayed_t> sumw(uint32_t w, const VT& arr) { + const uint32_t& len = arr.size; + decayed_t> ret(len); + uint32_t i = 0; + w = w > len ? len : w; + if(len) ret[i++] = arr[0]; + for (; i < w; ++i) + ret[i] = ret[i-1] + arr[i]; + for (; i < len; ++i) + ret[i] = ret[i-1] + arr[i] - arr[i-w]; + return ret; +} +template class VT> +decayed_t> avgw(uint32_t w, const VT& arr) { + typedef types::GetFPType FPType; + const uint32_t& len = arr.size; + decayed_t ret(len); + uint32_t i = 0; + types::GetLongType s; + w = w > len ? len : w; + if(len) s = ret[i++] = arr[0]; + for (; i < w; ++i) + ret[i] = (s += arr[i])/(FPType)(i+1); + for (; i < len; ++i) + ret[i] = ret[i-1] + (arr[i] - arr[i-w])/(FPType)w; + return ret; +} + +template constexpr inline T count(const T& v) { return 1; } template constexpr inline T max(const T& v) { return v; } template constexpr inline T min(const T& v) { return v; } template constexpr inline T avg(const T& v) { return v; } template constexpr inline T sum(const T& v) { return v; } -template constexpr inline T maxw(const T& v, uint32_t) { return v; } -template constexpr inline T minw(const T& v, uint32_t) { return v; } -template constexpr inline T avgw(const T& v, uint32_t) { return v; } -template constexpr inline T sumw(const T& v, uint32_t) { return v; } +template constexpr inline T maxw(uint32_t, const T& v) { return v; } +template constexpr inline T minw(uint32_t, const T& v) { return v; } +template constexpr inline T avgw(uint32_t, const T& v) { return v; } +template constexpr inline T sumw(uint32_t, const T& v) { return v; } template constexpr inline T maxs(const T& v) { return v; } template constexpr inline T mins(const T& v) { return v; } template constexpr inline T avgs(const T& v) { return v; } diff --git a/server/io.h b/server/io.h new file mode 100644 index 0000000..43be108 --- /dev/null +++ b/server/io.h @@ -0,0 +1,15 @@ +#pragma once +#include "types.h" +#include +#include +template +std::string generate_printf_string(const char* sep = " ", const char* end = "\n") { + std::string str; + ((str += types::printf_str[types::Types>::getType()], str += sep), ...); + const auto trim = str.size() - strlen(sep); + if (trim > 0) + str.resize(trim); + str += end; + return str; +} + diff --git a/server/priority_vector.hpp b/server/priority_vector.hpp new file mode 100644 index 0000000..f1c7d6f --- /dev/null +++ b/server/priority_vector.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "vector_type.hpp" +#include +#include +template +class priority_vector : public vector_type { + const Comparator comp; +public: + priority_vector(Comparator comp = std::less{}) : + comp(comp), vector_type(0) {} + void emplace_back(T val) { + vector_type::emplace_back(val); + std::push_heap(container, container + size, comp); + } + void pop_back() { + std::pop_heap(container, container + size, comp); + --size; + } +}; \ No newline at end of file diff --git a/server/server.cpp b/server/server.cpp index 5ff0738..8a32f10 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -75,6 +75,7 @@ int main(int argc, char** argv) { shm.FreeMemoryMap(); return 0; } +#include "utils.h" int _main() { @@ -83,6 +84,7 @@ int _main() //t.emplace_back(2); //print(t); //return 0; + puts(cpp_17 ?"true":"false"); void* handle = dlopen("dll.so", RTLD_LAZY); printf("handle: %x\n", handle); Context* cxt = new Context(); @@ -96,7 +98,8 @@ int _main() } dlclose(handle); } - + //static_assert(std::is_same_v()), std::integer_sequence>, ""); return 0; + std::unordered_map a; } diff --git a/server/server.sln b/server/server.sln index e3b37e3..d22be11 100644 --- a/server/server.sln +++ b/server/server.sln @@ -8,32 +8,50 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server", "server.vcxproj", {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81} = {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project1", "..\Project1\Project1.vcxproj", "{8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msc-plugin", "..\msc-plugin\msc-plugin.vcxproj", "{8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}" +EndProject +Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "msvs-py", "..\msvs-py\msvs-py.pyproj", "{CCC243F5-663E-45B7-A6DE-B2468C58B3A7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Debug|Any CPU.Build.0 = Debug|x64 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Debug|x64.ActiveCfg = Debug|x64 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Debug|x64.Build.0 = Debug|x64 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Debug|x86.ActiveCfg = Debug|Win32 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Debug|x86.Build.0 = Debug|Win32 + {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Release|Any CPU.ActiveCfg = Release|x64 + {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Release|Any CPU.Build.0 = Release|x64 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Release|x64.ActiveCfg = Release|x64 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Release|x64.Build.0 = Release|x64 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Release|x86.ActiveCfg = Release|Win32 {031352C2-AFBB-45AA-9518-DBC1F9EF2AF3}.Release|x86.Build.0 = Release|Win32 + {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Debug|Any CPU.ActiveCfg = Debug|x64 + {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Debug|Any CPU.Build.0 = Debug|x64 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Debug|x64.ActiveCfg = Debug|x64 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Debug|x64.Build.0 = Debug|x64 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Debug|x86.ActiveCfg = Debug|Win32 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Debug|x86.Build.0 = Debug|Win32 + {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Release|Any CPU.ActiveCfg = Release|x64 + {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Release|Any CPU.Build.0 = Release|x64 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Release|x64.ActiveCfg = Release|x64 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Release|x64.Build.0 = Release|x64 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Release|x86.ActiveCfg = Release|Win32 {8081FDAA-4D13-4B7A-ADB2-8224AF7F1C81}.Release|x86.Build.0 = Release|Win32 + {CCC243F5-663E-45B7-A6DE-B2468C58B3A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCC243F5-663E-45B7-A6DE-B2468C58B3A7}.Debug|x64.ActiveCfg = Debug|Any CPU + {CCC243F5-663E-45B7-A6DE-B2468C58B3A7}.Debug|x86.ActiveCfg = Debug|Any CPU + {CCC243F5-663E-45B7-A6DE-B2468C58B3A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCC243F5-663E-45B7-A6DE-B2468C58B3A7}.Release|x64.ActiveCfg = Release|Any CPU + {CCC243F5-663E-45B7-A6DE-B2468C58B3A7}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/server/server.vcxproj b/server/server.vcxproj index 221f1dd..0c38f23 100644 --- a/server/server.vcxproj +++ b/server/server.vcxproj @@ -23,32 +23,32 @@ Win32Proj {031352c2-afbb-45aa-9518-dbc1f9ef2af3} server - 10.0 + 10.0.19041.0 Application true - v143 + v141 Unicode Application false - v143 + v141 true Unicode Application true - v143 + v141 Unicode Application false - v143 + v141 true Unicode @@ -88,9 +88,9 @@ true _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - stdcpp20 true true + stdcpplatest Console @@ -105,9 +105,9 @@ true _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true - stdcpp20 true true + stdcpplatest Console @@ -122,9 +122,9 @@ true _CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - stdcpp20 true true + stdcpplatest Console @@ -139,9 +139,9 @@ true _CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true - stdcpp20 true true + stdcpplatest Console @@ -167,7 +167,9 @@ + + @@ -175,10 +177,4 @@ - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - \ No newline at end of file diff --git a/server/table.h b/server/table.h index 44a8448..0179ab8 100644 --- a/server/table.h +++ b/server/table.h @@ -1,9 +1,13 @@ +// TODO: Replace `cout, printf` with sprintf&fputs and custom buffers + #ifndef _TABLE_H #define _TABLE_H #include "types.h" #include "vector_type.hpp" #include +#include +#include "io.h" template class vector_type; template <> @@ -24,8 +28,10 @@ template class ColRef : public vector_type<_Ty> { public: + typedef ColRef<_Ty> Decayed_t; const char* name; types::Type_t ty = types::ERROR; + ColRef() : vector_type<_Ty>(0), name("") {} ColRef(const uint32_t& size, const char* name = "") : vector_type<_Ty>(size), name(name) {} ColRef(const char* name) : name(name) {} void init() { ty = types::Types<_Ty>::getType(); this->size = this->capacity = 0; this->container = 0; } @@ -35,6 +41,14 @@ public: ColView<_Ty> operator [](const vector_type&idxs) const { return ColView<_Ty>(*this, idxs); } + + void out(uint32_t n = 4, const char* sep = " ") const { + n = n > this->size ? this->size : n; + std::cout << '('; + for (uint32_t i = 0; i < n; ++i) + std::cout << this->operator[](i) << sep; + std::cout << ')'; + } template ColRef scast(); }; @@ -42,6 +56,7 @@ public: template class ColView { public: + typedef ColRef<_Ty> Decayed_t; const vector_type& idxs; const ColRef<_Ty>& orig; const uint32_t& size; @@ -75,8 +90,22 @@ public: Iterator_t end() const { return Iterator_t(idxs.end(), orig); } + void out(uint32_t n = 4, const char* sep = " ") const { + n = n > size ? size : n; + std::cout<<'('; + for (uint32_t i = 0; i < n; ++i) + std::cout << this->operator[](i)<< sep; + std::cout << ')'; + } }; - +template