From d1a6b1d83f3ba683e8283c8ca8fc0c20995b33c0 Mon Sep 17 00:00:00 2001 From: bill sun Date: Sat, 16 Apr 2022 03:35:20 +0800 Subject: [PATCH 1/9] update 2 --- engine/ast.py | 5 ++- engine/ddl.py | 13 ++++-- engine/expr.py | 6 +-- engine/groupby.py | 2 +- engine/projection.py | 11 +++-- engine/scan.py | 38 +++++++++++++---- out.cpp | 98 +++++++++++++++++++++----------------------- prompt.py | 4 +- server/server.sln | 2 +- server/table.h | 33 +++++++++++++++ stock.a | 4 +- 11 files changed, 142 insertions(+), 74 deletions(-) diff --git a/engine/ast.py b/engine/ast.py index 85cdd24..7c02e2e 100644 --- a/engine/ast.py +++ b/engine/ast.py @@ -110,7 +110,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) diff --git a/engine/ddl.py b/engine/ddl.py index b3e9f3a..130d54f 100644 --- a/engine/ddl.py +++ b/engine/ddl.py @@ -1,6 +1,7 @@ # code-gen for data decl languages 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): @@ -26,9 +27,15 @@ class create_table(ast_node): for c in tbl.columns: self.emit(f"{c.cxt_name}.init();") else: - for i, c in enumerate(tbl.columns): - self.emit(f"{c.cxt_name}.init();") - self.emit(f"{c.cxt_name} = {self.cexpr[i]()};") + if len(self.context.scans) == 0: + for i, c in enumerate(tbl.columns): + self.emit(f"{c.cxt_name}.init();") + self.emit(f"{c.cxt_name} = {self.cexpr[i]()};") + else: + scanner:scan = self.context.scans[-1] + for i, c in enumerate(tbl.columns): + scanner.add(f"{c.cxt_name}.init();", "init") + scanner.add(f"{c.cxt_name} = {self.cexpr[i](scanner.it_ver)};") class insert(ast_node): name = 'insert' diff --git a/engine/expr.py b/engine/expr.py index ae9769f..0c8d380 100644 --- a/engine/expr.py +++ b/engine/expr.py @@ -23,8 +23,8 @@ class expr(ast_node): 'mul':'*', 'div':'/', 'mod':'%', - 'and':'&', - 'or':'|', + 'and':'&&', + 'or':'||', 'xor' : '^', 'gt':'>', 'lt':'<', @@ -92,7 +92,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}') diff --git a/engine/groupby.py b/engine/groupby.py index 62a4e69..d03aef5 100644 --- a/engine/groupby.py +++ b/engine/groupby.py @@ -40,7 +40,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});') diff --git a/engine/projection.py b/engine/projection.py index 088bde0..644deb4 100644 --- a/engine/projection.py +++ b/engine/projection.py @@ -14,6 +14,7 @@ class projection(ast_node): self.disp = disp self.outname = outname self.group_node = None + self.where = None ast_node.__init__(self, parent, node, context) def init(self, _): if self.outname is None: @@ -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']) @@ -107,7 +109,10 @@ class projection(ast_node): else: create_table(self, self.out_table, cexpr = cexprs) self.datasource.group_node = None - + + if self.where is not None: + self.where.finalize() + has_orderby = 'orderby' in node if has_orderby: diff --git a/engine/scan.py b/engine/scan.py index 4766d7a..fdbca2b 100644 --- a/engine/scan.py +++ b/engine/scan.py @@ -11,10 +11,12 @@ class scan(ast_node): super().__init__(parent, node, context) def init(self, _): self.datasource = self.context.datasource + self.initializers = '' self.start = '' 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 +24,30 @@ 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.mode = ["col", node.table] self.start += f'for (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.mode = ["idx", None] self.start+= f'for(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' + else: + self.initializers += 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.body + self.end) class filter(ast_node): name = 'filter' @@ -45,7 +58,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 +77,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/out.cpp b/out.cpp index 8e4f407..6867019 100644 --- a/out.cpp +++ b/out.cpp @@ -1,60 +1,56 @@ -#include "./server/aggregations.h" +#include "csv.h" +#include #include "./server/libaquery.h" +#include "./server/hasher.h" +#include "./server/aggregations.h" 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 test = new TableInfo("test", 4); +cxt->tables.insert({"test", test}); +auto& test_a = *(ColRef *)(&test->colrefs[0]); +auto& test_b = *(ColRef *)(&test->colrefs[1]); +auto& test_c = *(ColRef *)(&test->colrefs[2]); +auto& test_d = *(ColRef *)(&test->colrefs[3]); +test_a.init(); +test_b.init(); +test_c.init(); +test_d.init(); +io::CSVReader<4> csv_reader_6qlGpe("test.csv"); +csv_reader_6qlGpe.read_header(io::ignore_extra_column, "a","b","c","d"); +int tmp_39gHMkie; +int tmp_190h2sZs; +int tmp_4a8dDzSN; +int tmp_3LAKxSmM; +while(csv_reader_6qlGpe.read_row(tmp_39gHMkie,tmp_190h2sZs,tmp_4a8dDzSN,tmp_3LAKxSmM)) { -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); +test_a.emplace_back(tmp_39gHMkie); +test_b.emplace_back(tmp_190h2sZs); +test_c.emplace_back(tmp_4a8dDzSN); +test_d.emplace_back(tmp_3LAKxSmM); +} +typedef record record_type2Te4GFo; +unordered_map, transTypes> g79JNXM8; +for (uint32_t i5x = 0; i5x < test_a.size; ++i5x){ +g79JNXM8[forward_as_tuple(test_a[i5x],test_b[i5x],test_d[i5x])].emplace_back(i5x); +} +auto out_5NL7 = new TableInfo,decays,decays>("out_5NL7", 3); +cxt->tables.insert({"out_5NL7", out_5NL7}); +auto& out_5NL7_sumtestc = *(ColRef> *)(&out_5NL7->colrefs[0]); +auto& out_5NL7_get1None = *(ColRef> *)(&out_5NL7->colrefs[1]); +auto& out_5NL7_get2None = *(ColRef> *)(&out_5NL7->colrefs[2]); +out_5NL7_sumtestc.init(); +out_5NL7_get1None.init(); +out_5NL7_get2None.init(); +for(auto& i4l : g79JNXM8) { +auto &key_ADPihOU = i4l.first; +auto &val_7LsrkDP = i4l.second; +out_5NL7_sumtestc.emplace_back(sum(test_c[val_7LsrkDP])); +out_5NL7_get1None.emplace_back(get<1>(key_ADPihOU)); +out_5NL7_get2None.emplace_back(get<2>(key_ADPihOU)); +} +print(*out_5NL7); return 0; } \ No newline at end of file diff --git a/prompt.py b/prompt.py index 9333997..94fbd62 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 @@ -137,7 +139,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/server/server.sln b/server/server.sln index e3b37e3..598688f 100644 --- a/server/server.sln +++ b/server/server.sln @@ -8,7 +8,7 @@ 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 Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/server/table.h b/server/table.h index 44a8448..abdeb06 100644 --- a/server/table.h +++ b/server/table.h @@ -103,6 +103,39 @@ struct TableInfo { template using getRecordType = typename GetTypes::type; TableInfo(const char* name, uint32_t n_cols); + //template + //struct Iterator_t { + // uint32_t val; + // const TableInfo* info; + // constexpr Iterator_t(const uint32_t* val, const TableInfo* info) noexcept : val(val), info(info) {} + // getRecordType operator*() { + // return getRecordType(info->colrefs[Idxs].operator[](*val)...); + // } + // bool operator != (const Iterator_t& rhs) { return rhs.val != val; } + // Iterator_t& operator++ () { + // ++val; + // return *this; + // } + // Iterator_t operator++ (int) { + // Iterator_t tmp = *this; + // ++val; + // return tmp; + // } + //}; + //template + //Iterator_t begin() const { + // + //} + //template + //Iterator_t end() const { + // + //} + // + //template + //order_by() { + // vector_type order(colrefs[0].size); + // std::sort(this->begin) + //} }; template diff --git a/stock.a b/stock.a index 8c194bf..f322626 100644 --- a/stock.a +++ b/stock.a @@ -22,9 +22,9 @@ SELECT max(price-min(timestamp)) FROM stocks /* "q1" */ SELECT max(price-mins(price)) FROM stocks +SELECT price, timestamp FROM stocks where price - timestamp > 1 and not (price*timestamp<100) + /* - "q2" -SELECT price, timestamp FROM stocks where price -timestamp > 1 and not (price*timestamp<100); "q3" SELECT max(price-mins(price)) FROM stocks From 2462bc6711971f0d15583a955906442208be7920 Mon Sep 17 00:00:00 2001 From: Bill Sun Date: Sun, 24 Apr 2022 02:56:19 +0800 Subject: [PATCH 2/9] update --- engine/ast.py | 4 + engine/ddl.py | 15 +++- engine/expr.py | 2 +- engine/orderby.py | 35 +++------ engine/projection.py | 35 +++++---- out.cpp | 71 +++++++++--------- q1.sql | 2 +- server/io.h | 15 ++++ server/priority_vector.hpp | 19 +++++ server/server.cpp | 5 +- server/server.vcxproj | 7 +- server/table.h | 148 +++++++++++++++++++++++++++---------- server/types.h | 12 ++- server/utils.h | 28 ++++--- server/vector_type.hpp | 8 +- 15 files changed, 259 insertions(+), 147 deletions(-) create mode 100644 server/io.h create mode 100644 server/priority_vector.hpp diff --git a/engine/ast.py b/engine/ast.py index 7c02e2e..a4aaf70 100644 --- a/engine/ast.py +++ b/engine/ast.py @@ -15,6 +15,9 @@ class ColRef: self.order_pending = None # order_pending self.compound = compound # compound field (list as a field) self.views = [] + self.aux_columns = [] # columns for temperary calculations + # e.g. order by, group by, filter by expressions + self.__arr__ = (cname, _ty, cobj, cnt, table, name, id) def reference(self): @@ -90,6 +93,7 @@ class TableInfo: type_tags += '>' 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: diff --git a/engine/ddl.py b/engine/ddl.py index 130d54f..a13ba2c 100644 --- a/engine/ddl.py +++ b/engine/ddl.py @@ -88,6 +88,15 @@ 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'] + 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 = '' @@ -114,6 +123,10 @@ class outfile(ast_node): 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();') + + import sys include(sys.modules[__name__]) \ No newline at end of file diff --git a/engine/expr.py b/engine/expr.py index 0c8d380..91440e9 100644 --- a/engine/expr.py +++ b/engine/expr.py @@ -40,7 +40,7 @@ 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): diff --git a/engine/orderby.py b/engine/orderby.py index ae410d4..7993fcd 100644 --- a/engine/orderby.py +++ b/engine/orderby.py @@ -16,43 +16,26 @@ 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') + col_id = self.datasource.columns_byname[n['value']].id + self.col_list.append(col_id if order else -col_id-1) self.order.append(order_item(n['value'], self, order)) - - def consume(self, _): - self.datasource.order.append(self.order) \ No newline at end of file + def finialize(self, references): + self.order = [ o for o in self.order if o.name in references ] \ No newline at end of file diff --git a/engine/projection.py b/engine/projection.py index 644deb4..204632e 100644 --- a/engine/projection.py +++ b/engine/projection.py @@ -14,6 +14,7 @@ class projection(ast_node): self.disp = disp self.outname = outname self.group_node = None + self.assumption = None self.where = None ast_node.__init__(self, parent, node, context) def init(self, _): @@ -45,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.assumption = orderby(self, enlist(from_clause['assumptions'])) + elif type(from_clause) is str: self.datasource = self.context.tables_byname[from_clause] @@ -83,7 +83,8 @@ class projection(ast_node): self.out_table = TableInfo('out_'+base62uuid(4), [], self.context) if 'outfile' in node: flatten = True - + + new_names = [] for i, proj in enumerate(self.projections): cname = '' compound = False @@ -92,12 +93,14 @@ class projection(ast_node): if 'value' in proj: e = proj['value'] sname = expr(self, e)._expr - fname = expr.toCExpr(sname) - absname = expr(self, e, abs_col=True)._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 cexprs.append(fname) - cname = ''.join([a if a in base62alp else '' for a in 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 cols.append(ColRef(cname, expr.toCExpr(f'decays')(0), self.out_table, 0, None, cname, i, compound=compound)) @@ -114,21 +117,17 @@ class projection(ast_node): self.where.finalize() has_orderby = 'orderby' in node - if has_orderby: 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 ''}(") - - if self.disp or has_orderby: - self.emit(f'print(*{self.out_table.cxt_name});') - - if has_orderby: - self.emit(f')[{orderby_node.view}]') + self.emit(f'auto {disp_varname} ={self.out_table.reference()}->order_by_view<{",".join([f"{c}" for c in orderby_node.col_list])}>();') else: - self.context.emit_flush() + disp_varname = f'*{self.out_table.cxt_name}' + if self.disp: + self.emit(f'print({disp_varname});') + + if flatten: if len(self.projections) > 1 and not self.inv: self.emit(f"{disp_varname}:+{disp_varname}") diff --git a/out.cpp b/out.cpp index 6867019..d91c898 100644 --- a/out.cpp +++ b/out.cpp @@ -1,8 +1,8 @@ #include "csv.h" -#include -#include "./server/libaquery.h" #include "./server/hasher.h" +#include #include "./server/aggregations.h" +#include "./server/libaquery.h" extern "C" int __DLLEXPORT__ dllmain(Context* cxt) { using namespace std; @@ -17,40 +17,45 @@ test_a.init(); test_b.init(); test_c.init(); test_d.init(); -io::CSVReader<4> csv_reader_6qlGpe("test.csv"); -csv_reader_6qlGpe.read_header(io::ignore_extra_column, "a","b","c","d"); -int tmp_39gHMkie; -int tmp_190h2sZs; -int tmp_4a8dDzSN; -int tmp_3LAKxSmM; -while(csv_reader_6qlGpe.read_row(tmp_39gHMkie,tmp_190h2sZs,tmp_4a8dDzSN,tmp_3LAKxSmM)) { +io::CSVReader<4> csv_reader_53LkPG("test.csv"); +csv_reader_53LkPG.read_header(io::ignore_extra_column, "a","b","c","d"); +int tmp_43xeYChp; +int tmp_3Vnt4fLK; +int tmp_1HKZwQBO; +int tmp_6IwJuIpg; +while(csv_reader_53LkPG.read_row(tmp_43xeYChp,tmp_3Vnt4fLK,tmp_1HKZwQBO,tmp_6IwJuIpg)) { -test_a.emplace_back(tmp_39gHMkie); -test_b.emplace_back(tmp_190h2sZs); -test_c.emplace_back(tmp_4a8dDzSN); -test_d.emplace_back(tmp_3LAKxSmM); +test_a.emplace_back(tmp_43xeYChp); +test_b.emplace_back(tmp_3Vnt4fLK); +test_c.emplace_back(tmp_1HKZwQBO); +test_d.emplace_back(tmp_6IwJuIpg); } -typedef record record_type2Te4GFo; -unordered_map, transTypes> g79JNXM8; -for (uint32_t i5x = 0; i5x < test_a.size; ++i5x){ -g79JNXM8[forward_as_tuple(test_a[i5x],test_b[i5x],test_d[i5x])].emplace_back(i5x); +typedef record record_type1CmZCvh; +unordered_map, transTypes> g6nov6MR; +for (uint32_t i4I = 0; i4I < test_a.size; ++i4I){ +g6nov6MR[forward_as_tuple(test_a[i4I],test_b[i4I],test_d[i4I])].emplace_back(i4I); } -auto out_5NL7 = new TableInfo,decays,decays>("out_5NL7", 3); -cxt->tables.insert({"out_5NL7", out_5NL7}); -auto& out_5NL7_sumtestc = *(ColRef> *)(&out_5NL7->colrefs[0]); -auto& out_5NL7_get1None = *(ColRef> *)(&out_5NL7->colrefs[1]); -auto& out_5NL7_get2None = *(ColRef> *)(&out_5NL7->colrefs[2]); -out_5NL7_sumtestc.init(); -out_5NL7_get1None.init(); -out_5NL7_get2None.init(); -for(auto& i4l : g79JNXM8) { -auto &key_ADPihOU = i4l.first; -auto &val_7LsrkDP = i4l.second; -out_5NL7_sumtestc.emplace_back(sum(test_c[val_7LsrkDP])); -out_5NL7_get1None.emplace_back(get<1>(key_ADPihOU)); -out_5NL7_get2None.emplace_back(get<2>(key_ADPihOU)); +auto out_684r = new TableInfo,decays,decays>("out_684r", 3); +cxt->tables.insert({"out_684r", out_684r}); +auto& out_684r_sumtestc = *(ColRef> *)(&out_684r->colrefs[0]); +auto& out_684r_b = *(ColRef> *)(&out_684r->colrefs[1]); +auto& out_684r_d = *(ColRef> *)(&out_684r->colrefs[2]); +out_684r_sumtestc.init(); +out_684r_b.init(); +out_684r_d.init(); +for(auto& i3d : g6nov6MR) { +auto &key_1TaM8D7 = i3d.first; +auto &val_129np3x = i3d.second; +out_684r_sumtestc.emplace_back(sum(test_c[val_129np3x])); +out_684r_b.emplace_back(get<1>(key_1TaM8D7)); +out_684r_d.emplace_back(get<2>(key_1TaM8D7)); } -print(*out_5NL7); - +auto d2X3bP6l =out_684r->order_by_view<-3,1>(); +puts("a"); +print(*(out_684r->order_by<-3,1>())); +puts("b"); +print(out_684r->order_by_view<-3,1>()); +puts("e"); +print(*out_684r); return 0; } \ No newline at end of file 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/io.h b/server/io.h new file mode 100644 index 0000000..ad7835b --- /dev/null +++ b/server/io.h @@ -0,0 +1,15 @@ +#pragma once +#include "types.h" +#include +#include +#include +#include +template +std::string generate_printf_string(const char* sep = " ", const char* end = "\n") { + std::string str; + (void)std::initializer_list{ + (str += types::printf_str[types::Types::getType()], str += sep, 0)... + }; + 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..fe06af1 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; + } diff --git a/server/server.vcxproj b/server/server.vcxproj index 221f1dd..03f1f79 100644 --- a/server/server.vcxproj +++ b/server/server.vcxproj @@ -168,6 +168,7 @@ + @@ -175,10 +176,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 abdeb06..ffbe96b 100644 --- a/server/table.h +++ b/server/table.h @@ -1,3 +1,5 @@ +// TODO: Replace `cout, printf` with sprintf&fputs and custom buffers + #ifndef _TABLE_H #define _TABLE_H @@ -85,13 +87,31 @@ inline ColRef ColRef<_Ty>::scast() return *(ColRef *)this; } using uColRef = ColRef; + +template struct TableInfo; +template struct TableView; + +template +constexpr inline auto& get(const TableInfo<_Types...>& table) noexcept { + if constexpr (order) + return *(ColRef>> *) & (table.colrefs[_Index]); + else + return *(ColRef>> *) & (table.colrefs[-1-_Index]); +} + +template +constexpr inline ColRef>>& get(const TableView<_Types...>& table) noexcept { + return *(ColRef>> *) & (table.info.colrefs[_Index]); +} +template +struct TableView; template struct TableInfo { const char* name; ColRef* colrefs; uint32_t n_cols; - void print(const char* __restrict sep, const char* __restrict end) const; typedef std::tuple tuple_type; + void print(const char* __restrict sep, const char* __restrict end) const; template typename std::enable_if::type print_impl(const uint32_t& i, const char* __restrict sep = " ") const; template @@ -103,46 +123,60 @@ struct TableInfo { template using getRecordType = typename GetTypes::type; TableInfo(const char* name, uint32_t n_cols); - //template - //struct Iterator_t { - // uint32_t val; - // const TableInfo* info; - // constexpr Iterator_t(const uint32_t* val, const TableInfo* info) noexcept : val(val), info(info) {} - // getRecordType operator*() { - // return getRecordType(info->colrefs[Idxs].operator[](*val)...); - // } - // bool operator != (const Iterator_t& rhs) { return rhs.val != val; } - // Iterator_t& operator++ () { - // ++val; - // return *this; - // } - // Iterator_t operator++ (int) { - // Iterator_t tmp = *this; - // ++val; - // return tmp; - // } - //}; - //template - //Iterator_t begin() const { - // - //} - //template - //Iterator_t end() const { - // - //} - // - //template - //order_by() { - // vector_type order(colrefs[0].size); - // std::sort(this->begin) - //} + template + inline void materialize(const vector_type& idxs, TableInfo* tbl = nullptr) { // inplace materialize + if constexpr(prog == 0) tbl = 0 ? this : tbl; + if constexpr (prog == sizeof...(Types)) return; + else { + auto& col = get(*this); + auto new_col = decays{idxs.size}; + for(uint32_t i = 0; i < idxs.size; ++i) + new_col[i] = col[idxs[i]]; + get(*tbl) = new_col; + materialize(); + } + } + inline TableInfo* materialize_copy(const vector_type& idxs) { + auto tbl = new TableInfo(this->name, sizeof...(Types)); + materialize<0>(idxs, tbl); + return tbl; + } + template + inline vector_type* order_by() { + vector_type* ord = new vector_type(colrefs[0].size); + for (uint32_t i = 0; i < colrefs[0].size; ++i) + (*ord)[i] = i; + std::sort(ord->begin(), ord->end(), [this](const uint32_t& lhs, const uint32_t& rhs) { + return + std::forward_as_tuple((cols >= 0 ? get= 0)>(*this)[lhs] : -get= 0)>(*this)[lhs]) ...) + < + std::forward_as_tuple((cols >= 0 ? get= 0)>(*this)[rhs] : -get= 0)>(*this)[rhs]) ...); + }); + return ord; + } + template + auto order_by_view () { + return TableView(order_by(), *this); + } + }; -template -constexpr inline ColRef>>& get(const TableInfo<_Types...>& table) noexcept { - return *(ColRef>> *) & (table.colrefs[_Index]); -} +template +struct TableView { + const vector_type* idxs; + const TableInfo& info; + constexpr TableView(const vector_type* idxs, const TableInfo& info) noexcept : idxs(idxs), info(info) {} + void print(const char* __restrict sep, const char* __restrict end) const; + template + typename std::enable_if::type print_impl(const uint32_t& i, const char* __restrict sep = " ") const; + template + typename std::enable_if < j < sizeof...(Types) - 1, void>::type print_impl(const uint32_t& i, const char* __restrict sep = " ") const; + + ~TableView() { + delete idxs; + } +}; template constexpr static inline bool is_vector(const ColRef&) { return true; @@ -159,7 +193,32 @@ template TableInfo::TableInfo(const char* name, uint32_t n_cols) : name(name), n_cols(n_cols) { this->colrefs = (ColRef*)malloc(sizeof(ColRef) * n_cols); } +template +template +inline typename std::enable_if::type +TableView::print_impl(const uint32_t& i, const char* __restrict sep) const { + std::cout << (get(*this))[(*idxs)[i]]; +} + +template +template +inline typename std::enable_if < j < sizeof...(Types) - 1, void>::type + TableView::print_impl(const uint32_t& i, const char* __restrict sep) const +{ + std::cout << (get(*this))[(*idxs)[i]] << sep; + print_impl(i, sep); +} +template +inline void TableView::print(const char* __restrict sep, const char* __restrict end) const { + int n_rows = 0; + if (info.colrefs[0].size > 0) + n_rows = info.colrefs[0].size; + for (int i = 0; i < n_rows; ++i) { + print_impl(i); + std::cout << end; + } +} template template inline typename std::enable_if::type @@ -247,17 +306,24 @@ template void print(const TableInfo& v, const char* delimiter = " ", const char* endline = "\n") { v.print(delimiter, endline); } +template +void print(const TableView& v, const char* delimiter = " ", const char* endline = "\n") { + v.print(delimiter, endline); +} template void print(const T& v, const char* delimiter = " ") { - printf(types::printf_str[types::Types::getType()], v); + std::cout<< v; + // printf(types::printf_str[types::Types::getType()], v); } template void inline print_impl(const T& v, const char* delimiter, const char* endline) { for (const auto& vi : v) { print(vi); - printf("%s", delimiter); + std::cout << delimiter; + // printf("%s", delimiter); } - printf("%s", endline); + std::cout << endline; + //printf("%s", endline); } template class VT> diff --git a/server/types.h b/server/types.h index 6d6c4b9..11c397b 100644 --- a/server/types.h +++ b/server/types.h @@ -118,6 +118,16 @@ struct decayS >{ using type = T::type ...>; }; template -using decays = typename decayS::type; +using decays = typename decayS::type>::type; +template +using decay_inner = typename decayS::type; + +template +auto fill_integer_array() { + if constexpr (n == 0) + return std::integer_sequence{}; + else + return fill_integer_array(); +}; #endif // !_TYPES_H diff --git a/server/utils.h b/server/utils.h index 0e1a4ef..cb58974 100644 --- a/server/utils.h +++ b/server/utils.h @@ -1,18 +1,16 @@ #pragma once #include #include - -template -struct const_range { - int arr[cnt]; - constexpr const_range() { - for (int i = begin, n = 0; n < cnt; ++n, i += interval) - arr[n] = i; - } - const int* begin() const { - return arr; - } - const int* end() const { - return arr + cnt; - } -}; \ No newline at end of file +#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) +constexpr static bool cpp_17 = true; +#else +constexpr static bool cpp_17 = false; +#endif +template +inline const char* str(const T& v) { + return ""; +} +template <> +inline const char* str(const bool& v) { + return v ? "true" : "false"; +} \ No newline at end of file diff --git a/server/vector_type.hpp b/server/vector_type.hpp index 05fe03c..2ec4cd6 100644 --- a/server/vector_type.hpp +++ b/server/vector_type.hpp @@ -22,7 +22,7 @@ template class vector_type { public: - void inline _copy(vector_type<_Ty>& vt) { + void inline _copy(const vector_type<_Ty>& vt) { this->size = vt.size; this->capacity = vt.capacity; this->container = (_Ty*)malloc(size * sizeof(_Ty)); @@ -30,6 +30,8 @@ public: memcpy(container, vt.container, sizeof(_Ty) * size); } void inline _move(vector_type<_Ty>&& vt) { + if (capacity > 0) free(container); + this->size = vt.size; this->capacity = vt.capacity; this->container = vt.container; @@ -52,7 +54,7 @@ public: } } constexpr vector_type() noexcept : size(0), capacity(0), container(0) {}; - constexpr vector_type(vector_type<_Ty>& vt) noexcept { + constexpr vector_type(const vector_type<_Ty>& vt) noexcept { _copy(vt); } constexpr vector_type(vector_type<_Ty>&& vt) noexcept { @@ -67,7 +69,7 @@ public: container[0] = vt; return *this; } - vector_type<_Ty> operator =(vector_type<_Ty>& vt) { + vector_type<_Ty> operator =(const vector_type<_Ty>& vt) { _copy(vt); return *this; } From 10ea5549e585712df709329d3b9b0f043f0b3ad7 Mon Sep 17 00:00:00 2001 From: Bill Sun Date: Sun, 24 Apr 2022 02:59:21 +0800 Subject: [PATCH 3/9] cleanup --- Makefile.old | 8 ------ csv.dylib | Bin 37784 -> 0 bytes header.k | 68 ------------------------------------------------ join.k | 1 - libcsv.a | Bin 483998 -> 0 bytes mmw.dylib | Bin 66520 -> 0 bytes mmw.so | Bin 31200 -> 0 bytes out_working.cpp | 46 -------------------------------- 8 files changed, 123 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 delete mode 100644 out_working.cpp 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/csv.dylib b/csv.dylib deleted file mode 100644 index 3dc33e4f338242f8d485f594e61c0296e2251264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37784 zcmeFZ2T)Vp)-aqvsDcL(Y@k@MprXbH3kpIY!4nKNK+#7;r6^*>L_|@73CJM^5wSPy z*gI0BD^;lq2o@|TAyf-h$+z}N5cRqD{_ngq|3BY9bI(l9?q$`z*53Q1prgJ^jY6R+ zQz#Tw_-VuMhzf-g%7Bt?;iJ}J-*1%>EwbK`n$ zMbvuW-Sj@}jYd8YoTuS(`#p zSM-NqMvuHdw>6&YHhKDz>EGw~OwpeUS(`#ZX+TTQ^N;ztZ``n@2jD;FH))={Y28G5 zh|<5o+tV`{b8~aw!u9puuv(G-XMcu)@&YqOd3Rco{C%#F>E^cD-QCS|o4e;Gt{Zpd zsz3Xiujp@pq63uv4c_jK6``9OZ-bxr1`jvy4PG0`{(r~c8byCmiux%1pZY_57YYP( zb7L}`7>Y(H;49)fitvv#;y1+0-MDmf+px}Ui~ssn8`rsQ;`;vE{<^zE{iF8X58{t* z9!7b9w~aki{pb92_^1|zGD#j#Q2NjQG!$hhaC2L?@;}Yb8rq|0x;&tu^soJ)xnYVj z6u7y0tmLlj$@mk0e7?Mlst^X0ru9_+M-0&cho74phdp-=i^+CUREbc8-H219k0>UG z=A{^dtcdi=82BN6`ZeEu%hm}V{_DI~k+mq4;Xq*$chH|Y*?6GeIjq!C{J`}`LJ|HZ(6G4Nju{1*fN#lU|t@c$PK?AW$b znGz8p5rQ#<8Cg@DaiTg7If||sm=TjgrWuPFix^IhIPrx+bO~gA-TGqA?>1+dPXq2#eKH7NiwIeL=gXZ(SU+uo2{bd}f$33yaNWh#3g-elUwb zBTU!~Z5jNwN!(46j}V32T}z<~^sc#O0i+U8=L~FKX)=nWP?cyDCXps)9JkQL_8?+- zO~8zV5W*BPP{25t?T_`whCq+mjCNU%gZzjKJjWaLXAM%-?RDm-#9sROofz?h#{ z#79&fK$d^5SqkM)k~kjHaVQgGm7{Xx3v!6hH8bSpaVV`Q0#^u%cE+IY4Nx%=yha8f z2B+d;l^yG$P&{P`3NU692`PtIAHhf(gqmT@niN}zFo_0wYE791np_r6WO0ZV4pGYy zt&gb5hfL`HRtlmqhpczAyB;ep#T{~q*U}k zsW^e_K<`knPF_1yWc{5H=1gIb9K`R?#Doa)c#^TmJj{p>85DZU^b%_2&YeOLbZKJ2>QIACd|(nS zIPnP=Yu!gaF)n!9gqsxL#CKM3DsT(~V`iIV(~B9cEs4k%3ogcjzr!f>9GnoZK&T~x zw~;{-P6qc~Ab_?UB56LvID{(@fcyCE+E`R-YdJ1RLSzI!a)T}y{GF8H4n!Rmj6n-}FqdE`Pt{LD&X-ZO!k}#)J(JBi;lTb9;%m%Lp0ZD!`Ir zJ^c&!DbX%?`$mwKB4{`89V(EyaSa5rq1=8D!-U997tbpMHG&Bc!6Jy}p2`QHXE&}G z-b1;2$as)=E?IXs4h)z(r&$4ly0H0~HhIk)s78!sD`R;Cnuc{(&uK8dD)29S2jD*@&4# zm4NGGM20~`d26AKGV=^gmcgM)Iqq#}NeM8LAyP9;vJ^7d1q|Xyj{X>=1Sei2k)GQ# z`dngNl{yki;FxI8BDgt=&kK{<0QKoP)C_8#1GTyb4vjzIp!M{mfWv{P#)A96J_bll z41kEhVTfn~F)oAYX;U@OnOAAwCqq?$~kNm0fT$wfd!vOnlx zEIb0Scw8HFO%jjF3WbqSKMa82CzIy`LYd-iGJ2(i15tVozXOny)>=eu=eVcQi|IKw zd<#{?;E*eJ((R&VQOj^@e$D4rAb|*G417#Gipw%^^OFb;1QI6v0)4T?G($m~jB7xo zF+>(3SdQroG0lh}(h@-T1>`E5f+z-P4IMX~Bpxc1XhCCz{)vZTnJkSh=4w-L_bgCA zlaQ>UIfAT`$Qq6b?Vt`lhh8jkgNOneHgw_@L3Rqv5IT+;kA`B1%tW$G4z&SCyuc5b zMzVrQR?Ue201kHyTdZX$XqRzs5!r}N!8zRC46zn~q9+1fP$-Q_hQ4Le3xN3FDS?G+ z0Ivh$x1kEz4D4oR5AGL{MWkwDijApEaR3$Q0F@C^B?|$72y&tPpAlqb3&3t(!^CWA z6kRZh@ke?Hg9&%RcudjwBi)1Y=X3!LR4kh1nUHzl?r8mM1&BIT*9TZ6cMP1S^~gB z$-p@pC!Dg?kp`BfLhcxpD@&6>H#5aZJ~82HU2;HqeUjH;eMR*EmQY-*qV5GVgY`%S z*kN|5g*~>%8K#IVNwKyyYU@r5!l~J^suVj!GSPj++dvl`fCy<}{fq{DL@jtl_X%JaDhgyrfHz9r0Pp*$L5qwSh zf56A2e(8bl`wy8+(AmYkF195hpa}$>GOiZ!;-^wNM_OXiXp-rA$mBiwKa$A^7WCgq zWCTVuNuo#e7U|}m6@p1^$K8wQEl5WN=u?JUV+S+IMPh0fgPO&lma(Z%e_3Ih>1f;x z(#mZ>D{LLg0Q$kyrX%VQhE3p?u&7^gbDn~T{Q*dZ;CmNNkX3jC7(W#fQ?X(o4I~`~ z?x8WDfhDp4LVgEIJ4bM>m_(JFm<(!xf|^7rM?7AW?Ve==OUamDmJ+^2Z=j};oSMaw znLX4@VFLww&^ML@B0c8Txtd|e+%cM5p<_>&JsP!Gl-qyv_O^|amFLYc#lDVY= z#Pg{{F;M>iT6B$wOjva9ww6&lfV=O?GQq+$oW$=O&O0aZ2jEDB)RT(|Js?xMhon~z zu$JJa{|Ax&0@nHOz)FF809Y_3IfyRSAi%}cc4`qOyia1$Y>1#;JptK_m~C#_TjiD) zc*#e+qyd)bXq!+oDqEHcpmM;#!i2*>k&~d3D>sldbev{4s5q6#0g{RksGbN^y}O`j zix?uqyRrc9)!xGJzp}`dE9Z!UTDRHEsWm6uM zxyeQ*qvm<%$-Yu3L22l=L7Jo&?%ib+EM4GTx*qI?v<4-d=)}{cBk{Dx(Y9jR0+VuT z6Sa+6C>Bz`_p1Pr0}2wfAfO-%=_y3P66lBlN{T0EQMvwAFfJ=b3dXG?uqzH*0VyKYXzK(35$T|=`E5v2vSILy#8Ye5}W=Ei&WG* z6*|nZja1Y;-9OhLkXX6uHX~K{45D1Ft*DBnhb^|yB9|Sf>Axr{xxXoN2KY&{Y6C>% z>(0{@``>tz4<6#b6<&pbp|B9J@G;;mFvT?W-_bJ+(1R2gh;n~AA{5d`U|FQ$Gm$b1 z1fv=JYwTt-lbR{$l5zVHO(2Q_u;+%$01DdO)&}csHKcEo{Z$y=U zQ~05<1pIGxpgm!h_NxvY3`YI`bvh8OYZ3u6jR~pXeQOH3bI`M9Xn-Su*e=YvQ_!i0 z1vf#d#Xk)~a&Zi|gkHL_hY71-Jps&tgUX`Iq@4e`G1ypBg3K1V3W^5_1S^7L-YtPe zU*%TBzYsw~h2bE#0KbzKpu%YA7Q_E13vdzQJ!Ap)NMi24h1UV5(gW}M|2@3#K{9{Q zIKRRB_RIg*@XCosPnB-@)4&BACIYN75d(BNwH0?Sr>ENR17^z2++TKoN=BpIAGH4h zP9EC*$%hP5;fTb@I^+=JVc!EeHKc*aQYhD!&wx)N7}Y>_A{U(#AVUy&>2gDm7s1tG z5^uY$V#!8SH3eQW$r^aU%wc~KCMg|Fq$A@=mJXZz{RHo*KzF3=3VyY|!eKZtIe5?H zrgaHw4QkOfLOS9PW5znvtPkvVlXjaks7fcYCD?5WV+QQD-v7#&nf}vmYnR(?pvZ7{ zU@v|ET_!gW+PN4mnhJK5uZY}zlM2Bu7m)^?w16pc0P73pVsWZK#mOMollVaDd#3a7I={BwLowg7w!Np>AL^B5u133;qiTM#3o}y=A$ZC11Cl z{$xC~G%)1@`}^YZem`_5{+IqX zY(kfGd)wrGnQ-_Yo9Tg&0i9a|$Ic}Js>tmb#a1@jroe=oB{CUX9AHc($bzDsjpz;gf4FyL z4LF6eY~D979NUoLg>BT1gVDXPRcT(>82yK2d|5ig%e^rD^3RwH{FV%+4TU;vY{MgY zMY2LRRLF)3=$H2y(^2_EHXc*-8CzEP8OO$_E7ZJOjW&=GDP zpu@vNL={*yIK(INLPJdwY*qqgv=EJ*;G_%Od-&Po)E5XvLIXJqFpcHpqXD_872wO+ z$SDnPuCW>{@6^{o(nXLAFxI5LLGBXl+Zn5yqO&m6v4+?zQf%gz(g75~Se+Q_3zOPP z&89Z_q*^ekspLCbAk)BhvtUF)R%vScR(;z;KOW&Rr9@#ftgbAwbNG$-LyB zdD6Q$bo$FFsaFIk?~5G4#8P64=YrYOX386YmT4ltrV8ldg)LUuHW*G%69Lt1_cS~! z4RU1+(v(E}Y@W^Si;I^~8L~`%fF^YUoRaWrr7A2UpZFqX8d1%gFq*Q21izToMxL`02%$t1Tb3>8QsU{82m8{cFnTI0I45wI!~%wQAkx`_ zcU|n(3bL3*uk-?YL`zA~K0$0K6LSUv(9Aq)JD^&LDv&{DjyS*wWp+{v*kX>75?~8{ z?NnYiqa~Hf?GJiPiJk+96zj>vOr1iEnMQ3RvWPa2m9c1KEF9Uha794SPQ!LbKpbpa z!MpEX*bHqIBSW~uEw=woWT(|A$x?|d!6#4*hFdg2c(waNp>%?vs;w2|c#Jj;l1RR_ zQ26tLG*_sn7MP%jVnc(ylGJb zyG)=UTr<4T^K-_(tq-`MZU8I|Yyyr!8Zn^^p(kt_3&==xF!)`jyb&DnVyc6AEhbC` zi-r}ZghZ7|11yi%85Wa{q>0wwNUY0y_|8Oai9xbNo4Cv*S3HT*47A z^DTtiP?+#2GzDgNgRR^wqJp1Z2)9Li;Vw-V$E1|s3F^QYy5kV<*=Q=_)fx`wbvWUi zjfKpCe4Hp`6E8XDHC$u){VOb1hwMVbuOGO6bHM4qVv9Lq!=-HV$GmqO0**SJvvHGj zHc^C|l)`=CQVA@YfW8%A6Eew5NWlETet~JQz+xxXXFCv$P!kj0fik$= zg$d6?We0@0;|PW@HLal*p7L939Kth|EuKws{%rU3EN?ssACp*9)d1CY_A6tlJuJoL$bv-RJaz#Z=XaW zQ+^)>T?6YUMaY$>u~>EJAL{U`k)1gSi%JJPBIH)fyX=Fe(aj%e&@CP(leu5I8(XD~ zd^Cj8B5;2I?YVQrTF2Q~av|`7eW8Q-b3iC)N49wew&yrRz^YJU66rurw%DGExFSyy zit_1|z*E3kJv<_O2`eB;rJdP`M8U4G<15u}Nu$9YZ7LS51}YDc63hoFY_+z5%)!r$EiyD_$9KcQ zhIK!o8wQ+O!PY4H4F*i;LPH`}gS59+!CnV2{axDl9yB?JbkhB)kc$cqBJNIQ!y%fN)&0TqyK2Iafl5@fJz z1}(s9BD|nL;)6=lJ}Sc$d|?W>2~0po{WG@w_eq=rn9<7H1t+rdiAzL~rRd2J^)w7# zp{`|YEGZ8cG+VJt-iw7(uK@;d_d9<5D;SWfR3rqHv@PiIXLI^9G7( zQ&p}jsw?V&OD8A>i^t9YQ0nNbi^Bm4Pm7*I`m&N!z;GNmJV~py^3GhlP??g}rXxtT zGRdYE;-Cx#X&R`sq}GxOG{^RxfxhFFAZn5(Xt%<`Sj69dpKRKL z2cm*q@~#KzxM*+z6QQUOZ#6Dq6KQM^Y$EmFBVAsPTErF<{zN)V(|0f%_MUkCVG=MK zcu0QZL4@Q14w3#JNs!)6f` z_%NVp7Zt}?xv*Oa*Xy>@U|ve#JLE#XAqpML(@`-ph^TNy0&zi+1eS)h+NtOy(WD7A zRG|Q)vdIG@nXEC8JuHWwV~LQ=!5qNjDh83yu|%J+$x+Y5IH@GSLcqP`81PSzLW_i+ zkwRO_Au901ZiR;rs{qwjDpzflII>eI3e{H029}nqw%=4!|2F7*61;FhCXG$BC=gHr zLiDc@Am}6kXa5Aehc(k%NSJZVAs=9d#`z@7q<+9S zg;FL^jVKgU0Up61Nn;mD5Vxk)Oku!nbP^w2AeJNyPN;vW2{+vl#z7`)roc%u;_=|r zZJG@8LY@lS9PW(4npJZJ5CUB?z|u*pGIP+##?hT-^zbYM1kD((vyB4d z05(x;Vu5B@ukQQ!Xg|P_8HVBFc~l0!9V`!40Wdcpj%|`Jw|E3y%Glm9FcLFtATw+M z*a4ONFLOcXm@(ALnPL905O+d`dImplD8F+k790ZOBY&_Rd4ssvA2g!={63^orlliw zjI^tHD<&*N6SW$H1?NHp7c*!$cof1Ul*md2_K@Kw*`Rz>aB8Ofylsh$-)VvgFF*~V z-1rSG#bS_eAAYABS4*xnuswX#7>*RdE-sXAW$?eS8T`+4S?U!Geybfzy^O&x0BcG% zl(!U342Z5CFfojw9JYXF#)gXO>0t~NGj`Y#RsI(z^$hirFov4h67_Pep)e11i=kkc zwf_Q|wm0~Zpyg?43b3Tg@Wld7Ad?(@34jv?(&nG`QMY}K?w$_-O^J(C&RC-W9dT88 zWd)Z5%n0`2LNbDoV~T^Nh((b_K$|QOauP|=ps>K+LdF&-##G!qlh-5>K_zX%lheG(9e&?G{;`KtrG0*3H!HH&Y zE!A=JFMhu4xS!_8Pg{ij(~|m$KQ{4(A@)}fl998vz(oV+ip`Wcpa(QwI|RSxf%6H9 z>V!T5gh)bD1*=*e7cYQ==rkSNycx6@gJ|FSK&r|lfXfTm=B?amJ^lxn%osndkPlxa z7%K+RAUZ<#k{yBrBJUE;0nEF2un4p=P1=ayX9#O>MntrO*@(PKp%Ag4cs{J?VT1Uc zlXyeA?PEB1>6`@GGYjrI$#St+RLZRdKZaY)qGmG{eVODa@C@WZ=NY~;GJ{{hAXEig zKo+cSh<(hPcq1hHVKhYpq*jO~G>6~-5FRJvdclU?D|jIV*7N-k`8@~euYQNy0LHND_hyNf!NyEb z=R;U(cEWW7*pfsJ-tT5Tx^W-WIR&_Pml~I;voTz~7U}#hG9XOlKyuQF7vOHL$uwVgHk(`7Vc)7qd&fs#D zu}!iZsI7>JM65!jZ`s6WvgcaPFfhio5L{eUxaVLtml--A))G_-D^^dbnQEvGDn`7; z7NmALm}l`4985CVt>th-DHYJTegkohAXJ3zy>YNev#38oSu|t7CIwXhH&$dB1D`WMJ+1+xwKDN1-;9*=jiH*<0QeX1$u!oqpkaGz zf#EEaNb^Qe0yOzVysnvrj8z2}Bby4_R|B;eCa<8|UFTV12N@&i2QtF3eJQ8_xpmz< z%Sa}NOhLsglLCf7X2HU2yTC@5{lb6d6(ql=Ab!;YezgF8ZDSJcB)@{q{ZD?C@$^{4 zD@hD+9?T!70y9{ofO-D28RAz)5){KkpR=g1Sj0LchCdL;1{(bXTl9L#QnD{TLLSNJ z4xB*TGP z0?Z8i3Bb%`|7@ZQdS}B0!C_gz&nduk0h$Ped92XQz|W`@T_5~eYN5#prK57TAWgy0 z8N7H0*db~yhqLiiIhx^U9QYae8o+P*YJ@Umo4Y# z4syg=R7H-du>;PR)XNa7P zX~D(YCJH)qv3(1GU^r0@r_O7@?qq;nE9ju|cG4?Bn>v6q9GnAvNZ!DU5tM}nL0VQ; zz#jIBNpwj3;6MN*Pd|(u_GJQGtEC^yAPnr!d-q)J86(HNw6N~$_N8m zi+!m~bNC`HgExfVuEHCLjzcskyncWueX+fa(ZbZyr1I3HV6v(BDzjyeyP*)80|2BN zr?-gx;j4?*Erw_rkblQTt|NXhFW5Twt&-(P^+1(j!cPbj;KK3L$gdIsdGgQgOxhXL zA{N0xLf1|T9sM6d2YaQ6Btfz+L>!__?x^gm01=g-T?5!cgE_DmL?`U_GECao+L zAngSfJPD`|&Z~I2457ym6gXZ~1KjRp2(kho3O-U>Ukg5J;?z>4y^-#Qs~b(-*+HEo zfA@t(#0yyl*#zn4mr~u!UC?z8gSWswK4EAq9nM1YMKI4ss3wZQzVTlznL#GVwSEAD zc+Eg_T;BYYc>_Dvm z1D^Pd7u9y71g!!FvQS63We6W&rK6H6YHPWmN)t-V3_|;Y_k#;E;A|tUi*26EOJkel z;jJ$eB*26Rku%MO7Z8S^i1jb~qZAJVAvfS@f1}QE|EshGf26RLm5j zQu0$&7JoZbfQnqepleNP)gtw8BODef|RF_kd>4#2z@=gB6#?fIG^Jpm%7Y9f@8HlXUpR zSy`nCK5&40pQQd}nx|s|DIkz2fupGb(>X@)H7ZKOk(zn2Zx!qa$+EG~8pvUZ^{C+B zxWgBq8JhHBcH+|~@&_EEpXVL0BX4HJF8Ro&!eK)byY)S6GAQFd=`FCA%n0frC8ZaW zC=F#!)0Fn|ia;weEpxU8oX6z?z_7!S(Siq8g3bxN2cE2^@8;kAJG5y-WdG7Hd}!0% zZ(l{fs4Mgtc8S#N_x@34veXDDAqR^v0qRLHhTsK7kud-=z;9s$wIOdL4!szdO)82XW{{@9!64-8~tQm!3=#Igf#V7`v3?7bnur^d=ILb!; zm;`5TYtR{-1p6~&*h-n zW8?Ena7l=?vg-|;fEg_5j!xqzk5IOct7(JiS z-($nK zJ$yq{4^r~>igPZf4=`GA^GEMBctYxr#-^FiKEL)FX^^C=w4QsU>)_T4!o_n|v`&hh zLk-!=PoI)>?i8bTO1`T-VN(##3)y{*qq^|U+vx522Z^8q8c{{kM%yh$ zgV+OYI;CgYdbL0PDAm)sxZ?O}-43tZmbrd@Rig$yE1bT2_Tf0nk9)(N4<5NSl-TWl zd++isLr>kB;_T|S;hyuVhp#41jfigd+-8%Am}@n-Fjxwf^NR8w;+Jr;+I zeR^oj;^k{2RcX^7>dvYk&Er4(T=$JOOu2p^;46n^uC!-wTJn(EZ-&)%M_C)r#%f91)R7vpPkHmKY@eT_bvC|)*v zhPoj=IXClIR{yR|S5?1W!8P5J*6-XF6o1mvp;Z0$^NJ^l<2B|=n-1)@YYM&){#bp* zx5SadM%7Or;j-@1+|MnVai7QDys~kO+V~B#i{9S2r|os~+n`*Qzp(QBlid#W5!t83 zFXmeuKJ2NRA9yZ$%>4wlW~^Fk=Z~&KX>L!leOFy(*E zZ);3#wJf-D`kKUP@5=qR{RZz<=4lHKX7x8-+Zg}t?z&h#0xMP-iP zeAB#t&9`H!=5dw_g6am1?!WxjknO&rsQXB_BNcV(PkS z`_CAq$7`tTj4k@eh-YeZd53K zAGtd4#U;xd_MNA{9vRKNeZr6Nrl8N$qk}uL=z;WuuLRHgl-Vw_wqE$%FtBmf&M@DR zK3=s`#^7EvKPE!*EXNLe9v-4hLzvO;Q=~F@Al7sR5HwA`aR4!Z`^UG!03~(F|u}r-5JNRyE?0) z<_VS3j;^=)p2y@?OfVm~-F>7jJyqSYv&*^9{*KVoE)N?HST^O3PS|zTd5Zsi_XksW z0izDRb}^eMa!#9b)?%a}(%@ENzm3$+`YX3j<%t?b_zgc%`!YAp|FZsaJGcJ4tziex zMCJ?`SVuhV=rz?h2V&H69J_Wz}^@|H{3WA1@h&2Sf<9E$k%cVNXSV(on1dGnj5)aBd#kM0XqK4h~n zM^(6fThO=ivcS7n1T#x6?ohAJE`2+>;Hle+=N_7&5y$L@bdGu&c&2LRvfw~f=VQ?g zpOw}E%_wS!~c0;a*)||atoz|RPfA-bOop~BRb{4o!jJmAUOQV;*lWP|zz}0rj%=VJE z7pq5!ojOk4TtCR3`gq5qV>+id-IBy*8fct3!H7LJCG}b6UPI&6ZL8+wC>Og^GuoKn z%l2=zK0dg>)yDmGmH*U5oeoo@bkaZAeAE4|zvRfHaogY8#z%cVdEid}9e;0}we;`0 zb-7bfx=##0uhw4I+?wERY2 zJ1pvG^3=Bn{S5X9gIkUs>EAcrYJ+ge4(E4csz-5CcfDHtseq`SSW!FZuX#uC=^JYg zMGV{8=$c*JWaXZ`RJGTIhxaZ!`tY`^)nlFOo3kA9rEjCgWa=(q*OVlEXgSfe;xF;C z7l~KPOgDSfoiuwi-kg8yZo!p94*ue#)sGq9{ANeLj21Y5k1lJfTVcR%zcT&Xu6TIf^73oGVEvHRC8zRc z+ia6+iyix|Jg@$d+Z3GqV&NjM1)FOA_J1leid;8(Ld5EpH> zIh=C%X+cQz`7y;$dY`Z1H|@OnBUKQS{q&A1U-#+omFrv$EN`DL?g(;IAG(qzJ;%mlC^wHy`h7t{wo7sY*WKFyXVVNT-~F$Eq%7C_`|ia{f}sxHJSxv_uEW#hV;I+z4z%5 z{=sMm%Nrl3xIWWeJh0d%#$T61YDx*+UXFN;vQNFtNEH` z7dX`q2aA<8OIj{-jD|hs6r5f@&U2IS$sX=Aqt)J&p&7Hc&a}!be)B9_xTT6g`TC;H zM5DkjtG{OFg$S30l+8M8zCKBJjz9Utzu;bjm$g`L_vVzN&kwvax)wCa*%~kBG-pnv zkEAr?l{L~cNf~FR~pMyCg6Z22| z95Aa(ro7O;o!dFH(K~&QU7XFO2J3kXTrE2^eQ0-0Tt4b97~ALEg?m~rKc>IK2DR?H z>YGp-{Hba7f#@xj2dci_U4(git{zsuBrbG*aom8TU* z_N~HA+r{hZxddrdap8(tX?Ker=rmXzdJ;40sG3T$jwUK=OdYL!J})3`x*mH@1*uyTQbjW&;Ma*I&0X1 zi!1w`n5(|*qSl#Y)i|+tHP&H}u}bqx!94Z`d{lGB>jQ1?zH~fk%s5v`EPb$bhR?Ff z^+yb=cuVa}4z+peX@vZ>kVqck(zp5W-Ncr_C8E`-7soY>pWsrzGkPtzvHt_>>3C(- zOT)$Y=AKWFk-qvc-)@j@Lf;STR<3gR66vKsq`EBnP)+~A+3g8KZ~3iwI=L~#c=`Sb zx`SVG_3}02__8Z8*YDp?SY+Hc@@SCu#}z5hbq9`k@4c@6aEt7%&b||eA75?!CQftz zI;6u&oO@UBBleKbmfLp%ZeMKMHz_Il!$Xe%yTVtmD_sj)?gm`@(7PpBd;HljpUX3B zwl_WXIT?9(LZ1ir*E1b+ijS;I3t{@L*#6w(Wch=b9cn3An`=b&0qa!UR_*a+U-u|8 zoZZLN^>|ih%Z$qf$IC6XKOA}PZ?@Zi+dZNrBYmz|XRypZZ$58(wFecQq;ojWC>9a;(zG%5UDt~fqm&vN(mRt73nS^>hF${8BXti|b6jk+@ zQD$TLGWRpBqY7@lOjpZYI4R9+h3sL@{U)VX2ksKzR|hmRrdy5w{_dLXvu#7KC8pL- zH4$7oeo~urMK~vF&U5-@;TQM)N{{=zdFHv?|CHv=63?cGQ*2wF_p_JX?{DWY;k;G9 zL)6-%thwPSMfr2)n~MvMcLsT+mcHFQF(iHYhtN$KySJa+*~D2oH*xfqt**|a687&6 zo_lCxo6hq#wY4*9Z;pv=9Q7_yG}T$Nm7o#Tm3Pivy;V^=L0J2QdyO@2W6nG~pBvec zCnI$!Iig-O^Ag|pSFPCofH|$db>fD6jif6tPwt6WQmwBtSZA%K&6C*L%jr%Xi}#t1 z(6!%fclor3r_&cno9W&5tA}0=KXPDp(k_!t#(wQ@S{FS$FmBhjB~u#*W^S$R6fKQ) zwy2ydU99XA?Wb4Waie*JPp`<~AL}0lhaOyVD!!t=juk%js+;7vBkxD6(!EfC zrj6lo)p4hj-dtQ5?}N>M%E`Mk%IK2X^}~giF4^@xPZ_#v;#!r^-&K{$+*NgHj zeCDEv4%5JvvmKMMiF^v-o9kod-#+ACUc9V$Mzr;~c@IN^${vh5(-o7lhn=m{@^0$a zTOTLK8K2H6`)ax~_l34C-8I_kV|`|#wy(dT<^26oJGr3+ZkOA}?$1B$&N_=S1e?vuUUCC|N7rGooCY-S0h$G|C|wTWpmW`UB`ui8a@dt z9v>d`Y<14*Jx^a^EAmt%aj{85bJ7y`NGMKyr_Y)_VzqJonwfX5NJdaidc68Pg`MDR3M( zE_~^OE46#imzkw#$Ij70x#|zdpIfpiFY{p3a6LO>tMW)vm4@ws}-! z&8A#h-$QqEi?W>)y|r(}4%hzi`0$PumMSyHjeVrE?8Dmm0S|T_i`)C2_V=;vVe#QM zcdkcRR>e`yi57%9F9-ie`|1#^vF#CwTQ<6R%;_;R_>D3yBI!&nX zW0cO{RUEm+`>3(;6-j*I^P*nWulD#AW~7*2f96rcoRc|s`N4bkt11p#)Cp(x>D4&1 zd1=zhR~>~(b4FhbfBv*K?E3AxgeY^?^&z(lKHCRfs2}ip_1EvVbH?Az4=T&wv?r>d zmQVk#x4hNO=B!xB;j+JAkF(4DDo(m=9jU6Dc`9hEa+m$og9{!vl-$^Js8wb7H$l=X!Hk77 zdCaGJ$;WJ``1>AO8~JE-SmZ&`wb3bss0MD||1Zk5h9U92wpa zd7$vL?WzfrWi#0K&QG0u#V;;n&$EvBu4IkB-#R=>jym}9-etmnP4WcJi)*)Lv<3{0 z=%d*(hdS*fhLtbVnDWy2-od?JPNfNjj(vOIn`6^=!rO$6w^To0@EnsDI)9_alZShs zu_iDd?6GR^x?-HyOD4U^E;HA^;JvRk`FVX(e%HrJLx<3%y_s9?AHHyJD#L9PL7#N6 zEmU(2{d@jOVIRLIS7!wzOdY44{^Oy|_Uh+RDWwhu-n6X|lP&Liue+&|G%ZBuc3L|7 znAOD*!r2D1uRXrxG}!mAm;3^3oaexIF8v=AT|Ph8y6?)2l9_Mji4Skk71WNRt6wu* z>Y-V7Zj&Xv&Xey=mWm^XC*5ZcifvZDBJ2*LyCaG)`;T;r^cqxG?v1 z=*RoNq@(GV-QNF_rlsTB(8k`mCFA zs8`=(WZF8=;;z10&W`-UsbpH`^qiq^BX>}GQWKee7Bb{(sP_H&N4FkAX+Bf0FI_tS z-FYj$hbSHG{G$Jlk=293=M6+BW)$_S1+K}{3JT+j8Y5Anh4Bqcg8QfTZ;) zOZ(=5S+<$C9vrHMbfL=A6YDoFtKE@5dDlKjpB+Kj{Xz8Q!=T+Mu6JRyu<`t}uQp6N zb!OGXDOCX5^=U(UJ!idEx^U8R*j_lFcryI!C|2n~+ukZ-lbdiH6gckorbC<^&lcD< zeW{>W_i@|$O3MO!YW!u~*78tF_S#Nw&Cm;ul!nIG1HG?OwzIa=v}?oH@FiEzPcMGX zFE2g9ia77fXxc3Gaz7V5e|AXVxQdIj7p$9m(b_`mlJSexZm|&&M?KZv70jPgP`JK; z(fa=0SJ`Q1eUR?Hpxx((5!-t=x20qqTr<4v^RRQ;YsU>-Xxe(yJW)xycVlf{1as@@ zi)~+ztFO%%xv5um*S+VCvkRwwR$>i5)_>IKd8Z>hqsH5;Dx;QO;h$`58lLrSSNwzG z84fn0=T*XS*QITDUSIOuLsS*}1#A5UrxeF0N<&Y7b$;Uh{9=KOZL}@DbEHq!W}g&` zu!xL6!_ob|Y;Re^} z=o$U2d;P094el{lE^*onJB{5~%cIsda%Wx6t=TvAgLy-2DKDNmPB+}~$Gf{s*X+w4 zoRUxdVh?SOd04r^e#YS1Wb8x4Q+k)3#F=>bD)jvM8+`}gXCx;bald-iNAK!Whhr`t z?}|+8cUc@dlvx)Ry=ldRUE;GAP6gG2hkTE@p1pUv=j&T}b4+aAE{vS1`=aA!NSFSr zIeY?|%1b(6iPY&g`u!~DgB_-iz$Lu!E;>FmzdiaqzuQi37+gxv%I40WrVV@DhQ_HT!XyvcbuAQv@Xk6*lvA49#izBER z5$CNmzg2o(9TcvfCFrQ~ugF|I%73BNqBFO1VcWaIMt zqm(%H+gA3(ZjNCTi#gd?#;>G{Cxd^zB!WVL!J(t z@le@qM!r3Jn@i`2EKlob{3>n7htz!2IsH#=Jz+J*LtDD)*x=1J?Sow(MG59jPAa@G zlj5m;z|WKW&EMnwt~%zv+@WqYiEC5V9L*atx1g`+=&qWr@7A&!(^Ga`9F|dDZ*}Ud z-tou%uHJ1NqEq{2uB6~`bsc|ZgMHyaU3*`bqUJM+Mq^gyUUp?B9)1~qgS8=S>?q%M z3q78GZPJ0sgUU2azqx!exH#V1A#%|Pw@sr)SuC0G_H2P)Mpf)OfuGi`iK30$kBTy! zzaIH8+v6a1qH}$(I;&~N?jLy*er-N{xyS#O5Nj<*Y z@=g8wX{%#bn@n8y^{C6Rze7aahTW9nD*vQCn^SK{npfZGbLAXgbxC=hM7(K`M+3Fu zVAPYL_{QEfcU(duy381%uU-b~iB&Y{uNy9z&Dy=-ivF|HOPcKFBps?PN_+aQ`q`iy zwN2LsoLYBk@`$6U*RkMRuV|S*1@DwuGM|)5M;$L3>W4hA6I2TO$?O^f0&5D~kFE9` z;Gz3*gWF#H8}pijcBQVc+P5oj9^0?+*wJ(A&z@|Wj{UVf`Msg@RVrUgBk%EewUU%? z*O$4E?WYtyFYiZ7Yj)PeEibn0s&Jq_>T~*3$FWy0e|%a!X7GYD)G4KQnQ>Horyp;F z?s#6%ut^t{w~n$IbU9$@a3eQ0JMSfnKOJ-Nz9kWF0wrPAmc78;X>)zF=lil;@J4jiFtL&y8N_b%1ChMeL80ytO=}39T%*)mDV`bZI z@?)%A>yq>Dh4nS6KKEv?gr74z;lMQN?Wybj+L+nDX~f&a7cp@{hAVS6rB~eGx^*wc z>Xdw}-p|!vlB#_%vhRniLAACK6D!wTpLQgBkKce-{%1Zo-Rta=afFqeU=p?5sXS-! z+PB+FzjT$ZH~Bg^(QNdoh41!idAYb<{BU%@2MP5y>(iiH`vNDl7PzJ^clEFt-2cq5 zms^ZFzS{COZB5w4_Ps$nNW?fA`rETr*LuIM>|Md?xEi^}z5mI|Jv8Og$jJF+ZKbg` z7OukL%dGUr$N!ED`8(v!WmZDuh_GIhAME}-b({QFB8XF~VJCfL27bC&67x7->HI~FRVUUB?dNtTLcQ;_HOf!1z1uVP z#8gi8SX%8feAsY4ad>=%6Pum>sXm~*}IVieT5kb_G<v=)jyiuLxJC zxK2p8(lEV1(C#=k;ozO`FRI-Y1FGXp_b;{mAr%x?G4BJY;KS0FWo!4 zC|+0M8h3@d=;^fW4Z3kphTprof5u(SH0P>S*RJ&c7&z`szgUeG4s@R*I~GTseB-v2 zed2wuxac3jyO!4POqX^_t~0{bwg{8^?sL&Iy!&yx$H3y-+51M`D8I8|$$Pixqe-Xj zUMGIJ@gm$UcVoj$8ozWzU6_-LHXgs@^+<`m%Frj{FI``IL+99~L5pslKdCxK)~fS@ zRuRQtaAurA$Z(p!?AVn(HtMcT#mvr#G2>W^Qy2#?JKA%vsr8#NBPv6lA2}v z4->~jZ60V$2yi_fAna3-&^2Y{LGO`!%`45)k6$<#;k`=`-(fqUQB61fj#5G5SLNj& zR<}p({KlLUe{*Hfw{7VO4OIq%Urz3K>XJdinaTaPc>kaFt~{*9t?jR8ex3@uI2G!Y zluA?-LQ*Ld(QJy{ZkHw{4U|HpB59BzWQbH0$`CT-$Pjg+fedAKh$uxe_TJCl+xwp5 zd#~@m@1O5#?Q1=2-Orlt^}B!f`eW6z*3f%i-Wg>(tl1 z*f)#%avSHc`yK^{MMYRy>#jWSF9ChmvE!8cFIT&CB=E|u@27254<)hl_GIo4-Epj`CTg1Rn3fRP`P8*=^eXe4sR#8cFE-^VpBNZ0YwaHS@{YRp?`^l8 z)Ux;41o=#QIVbY+soh(3ju+>=u=n26PZYBCq|fAY?=&9v+B1Jb;+!ajZ(7~6-n`Cp ztD#RS9K2hZ*c8#NoYB7Swzc;AJg)jev#U#4<0+#zNiIQe6%|$+Y7fHRVJh-L2arN~v0dBfuH+~9vtkN&~gUi#i z@m^a_PddG0a&k&bRb+V3mW;EdxvmSXW*PE-=lI~Ua`oxO0?EboEH2P^E-J8><(!9Tc*u5m8CfHjOZd6IQ}2yQzs zXHA%?ifA%^v1P4ik+pKD!~QgE{^tg~P4_^gN8Qe9&8iPpCq8W?T1HfFHL0-1^}Cli zXGbg{eOFppXrA}aj@pw@x3>AJ7wS{v;5Y0tH~X3&``7-+=!?#_qBUbiDHwiUlk}*{ zeMd-MWlXVk_O)|6(@W$nmwM)|`|)6Y#`@0%mqz9EzLn8+GvJ5wsIE7k+&d;YC|y3? z8Am;I85G?yS2@!@WW#ck<)P(w@|))ry&rhNW4hs-i>foj75aLIsJ+|wHtbQ<;hllT{nN$ zz12Bs@u3~}LITgPiT*0zSZ4mRP~Hs_I9y#Mp8KVDU90?{yE6`9u8%)WF^}|Ueio6} zFL8<7YSWf4g+5!4Kl5;@xtHI|A=@f%tm>+my=tcUwt_mxy_}Nb)Q7)2JWtnLZ}2*9 zBssZ2?yY@>=ll}Cz>?=V6XR9f9rD$?&U|=gO+Qz!PFc9Cz*9+QbVp=$bKH^I*#4f@ zfiVURe;BJ+Ki8hiWNUOOCCuxbe(YP8v-%NZyX(3o+kD$i9zQg<$;-JHv-4~5{uNlO zWv23hq*pX+Xtirb!aL6`dKxJ+4)0@=qS7xv)g5}Kv_1FzzS)&YEe$6>J}3_N^*<^& z;-gY_rz1CgyMAl_Q8}9izqrWWl3vF z!G;vqPnSy8-x{DbRWj-pBm@@8SE>hBv&pzC`t_%GUKh z>o%?PSss&Xv~uIa&%3_9S$XKx>mQi|)6O=HaF2}tlKcB@p92=Fw8DqFJscI7;h|>| zFVsy;-Lh`nZFgew>9F=yxnth@b(9WWpEPXktXx5>#;y3_lZyN!42JJK*6ADYvG1C& zZ~DEx^v7pe3qN32+B5g1MxRJ8?XZjMyKIT|Qlp8LVLJwmJ{Y2=-B91F&gE=N{Kaw;X{b6eL)0jCYqOab*)o4Loom6~(^}xo(*#o-dsLd$} zr#3g~jYw~Pkt5hSBu=gWiT0Qqp({R$HLC0XXxlH=5E-d`zuDMso`>1Dw&HdP`6^vec$$dW zt`G&JUD4jKFxKF!?)_$~t&N}8p6Gl#Jl3=GbFq_m?O7MI+$UlFWA}E2MJ_nDQtW2> zjM@0=$zbp3sqznm3(f^#jdn#|_lHf`F`zpAQ$*ku%*CVet01zz<}wq0OJ?_k6JxyPCYeQQAj;WWyHA!&9PEVh&!sbD{p=oK*?) zr&d)Jq`b8YNq%S7&sZZrd~SD{d%K@UvQdCX|8GNT6-RV0ZZV7tJ2n5(z0~=$;|f-G zUvc?9qC)56$XgxZhB0hp?I-XSB_qZ5s%}0*S{+dHO3{PL3vaFQHft2r4?DRFM@I{bWM-^VX9v&Any-+h)lc-g(CKB}`*yKNR2 zW%;H|UHUrjHP>erB51Ccps&gR^+DRY28JU>nZegh{|qd~5-cs?1ib`Gsw%4Ls@j?c znkJg&nv?Y$_2%jM8iyIj8mE|LnH89wHLJ30vTU`)?S8YG#PGLAj;}ii2#%CB7as-DUi*b_I97FR3B+KG_8BUTIDJjNrxKovHNMneQwkF`f zMMl~O27R*(E9r@$agN|fNp}Q`ku=BPl1?!WF$BrdgrsX2k7h^$qb2>549yY@MzOeL z5S(C1jHMX3@Is;}hH*IJaF(MeBvG2;XhhN^$uKhgagIeefkQ)vmQDpDIfP*}G=W@s957(oIgh{2_J z;V^pwIwC2WAqdcd1`T+tU?c_h0?c6;ng&%^L`z|0aE1bfX$;UKNSxvjK}ZoLXoBGw zmIW(v7=z&)g~5EWGEO_iZh2ek|P;}F$@m)16YIsX*inYI2jpnmc%ib2MO4~4*`uxmLxewMo|ok5ewP@LVx2VBnfl}dVzBgJS2R3f&fCWGXKHgl4l@4!b#qjDVhRc_#VK>EaH&Nttj9P zhQTVpJ2J!K48p-`;B^F4r%0Kz;owvhSQ3cNQx^l!z(m(|S zAlV8bXRhg_MOMmtg z{4>L+{{9jv90Kx&55M^IKVjj2vj2Z_aF%&b=s}am2Z0_0dJyPApa+2- z1bPtYLE!%!0mVTAS8F&M!NO7~6#7O+3PXHC!xjgN7Ws!q36~lprzOT|ihNmExJVo* z6#E4VeIrDn-YCt|J8F?PypHe^die)?`-Gy{i?9hI30T?^OTNdsF5zRteL{o$gGJ#! zOHmqHGF8%<*K(iG#k}Y!8CM)B5_fik_H#4 z{O@vpbLH>#W2ExG>!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/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 From a81fd176e9d7b4795e9ec29da152b5ded6e087cd Mon Sep 17 00:00:00 2001 From: Bill Sun Date: Sun, 24 Apr 2022 03:02:01 +0800 Subject: [PATCH 4/9] modified: README.md --- README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f1c753b..b12e302 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # AQuery++ -AQuery++ Compiler that compiles AQuery into C++11. +AQuery++ Compiler that compiles AQuery into C++17. Frontend built on top of [mo-sql-parsing](https://github.com/klahnakoski/mo-sql-parsing). ## Roadmap @@ -8,13 +8,20 @@ Frontend built on top of [mo-sql-parsing](https://github.com/klahnakoski/mo-sql- - [ ] 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 + +## Introduction + +## Requirements + +## Usage From 70d7167c1ec3579b37272240c0a1b09e46ea7dbd Mon Sep 17 00:00:00 2001 From: bill sun Date: Wed, 27 Apr 2022 06:47:00 +0800 Subject: [PATCH 5/9] bug fixesy --- README.md | 4 + engine/ast.py | 10 ++- engine/ddl.py | 50 +++--------- engine/expr.py | 17 ++-- engine/groupby.py | 2 +- engine/projection.py | 27 +++++-- engine/utils.py | 8 +- moving_avg.a | 2 +- msc-plugin/msc-plugin.vcxproj | 4 + msvs-py/engine/projection.py | 145 ++++++++++++++++++++++++++++++++++ msvs-py/msvs-py.pyproj | 90 +++++++++++++++++++++ out.cpp | 74 ++++++++--------- out_attempt1.cpp | 60 ++++++++++++++ server/aggregations.h | 63 +++++++++++---- server/io.h | 10 +-- server/server.cpp | 2 +- server/server.sln | 18 +++++ server/server.vcxproj | 1 + server/table.h | 85 +++++++++++++++++++- server/types.cpp | 5 -- server/types.h | 69 +++++++++++++--- server/vector_type.cpp | 10 +++ server/vector_type.hpp | 11 ++- 23 files changed, 628 insertions(+), 139 deletions(-) create mode 100644 msvs-py/engine/projection.py create mode 100644 msvs-py/msvs-py.pyproj create mode 100644 out_attempt1.cpp diff --git a/README.md b/README.md index b12e302..7328873 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ Frontend built on top of [mo-sql-parsing](https://github.com/klahnakoski/mo-sql- - [ ] 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? ## Introduction ## Requirements diff --git a/engine/ast.py b/engine/ast.py index a4aaf70..02d3464 100644 --- a/engine/ast.py +++ b/engine/ast.py @@ -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] = [] diff --git a/engine/ddl.py b/engine/ddl.py index a13ba2c..0c946b6 100644 --- a/engine/ddl.py +++ b/engine/ddl.py @@ -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 diff --git a/engine/expr.py b/engine/expr.py index 91440e9..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 = { @@ -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: diff --git a/engine/groupby.py b/engine/groupby.py index d03aef5..8d2999a 100644 --- a/engine/groupby.py +++ b/engine/groupby.py @@ -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): diff --git a/engine/projection.py b/engine/projection.py index 204632e..22cd5c6 100644 --- a/engine/projection.py +++ b/engine/projection.py @@ -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>' + else : + typename = f'decays' + + 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) 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: 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/moving_avg.a b/moving_avg.a index 2d4d5fa..391f71c 100644 --- a/moving_avg.a +++ b/moving_avg.a @@ -6,7 +6,7 @@ FIELDS TERMINATED BY "\t" SELECT Month,avgs(3,sales) FROM sale - ASSUMING ASC Month +-- ASSUMING ASC Month INTO OUTFILE "moving_avg_output.csv" FIELDS TERMINATED BY "," diff --git a/msc-plugin/msc-plugin.vcxproj b/msc-plugin/msc-plugin.vcxproj index 78d05a4..8e000f0 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 + stdcpp17 Console @@ -108,6 +109,7 @@ true _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 Console @@ -123,6 +125,7 @@ true _CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 Console @@ -138,6 +141,7 @@ true _CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 Console diff --git a/msvs-py/engine/projection.py b/msvs-py/engine/projection.py new file mode 100644 index 0000000..0eafd1f --- /dev/null +++ b/msvs-py/engine/projection.py @@ -0,0 +1,145 @@ +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.scan import filter +from engine.utils import base62uuid, enlist, base62alp +from engine.ddl import create_table, outfile +import copy + +class projection(ast_node): + name='select' + def __init__(self, parent:ast_node, node, context:Context = None, outname = None, disp = True): + self.disp = disp + self.outname = outname + self.group_node = None + self.assumption = None + self.where = None + ast_node.__init__(self, parent, node, context) + def init(self, _): + if self.outname is None: + self.outname = self.context.gen_tmptable() + + def produce(self, node): + p = node['select'] + self.projections = p if type(p) is list else [p] + print(node) + + def spawn(self, node): + self.datasource = None + if 'from' in node: + from_clause = node['from'] + if type(from_clause) is list: + # from joins + join(self, from_clause) + elif type(from_clause) is dict: + if 'value' in from_clause: + value = from_clause['value'] + if type(value) is dict: + if 'select' in value: + # from subquery + projection(self, from_clause, disp = False) + else: + # TODO: from func over table + print(f'from func over table{node}') + elif type(value) is str: + self.datasource = self.context.tables_byname[value] + if 'assumptions' in from_clause: + self.assumption = orderby(self, enlist(from_clause['assumptions'])) + + elif type(from_clause) is str: + self.datasource = self.context.tables_byname[from_clause] + + if self.datasource is None: + raise ValueError('spawn error: from clause') + + if self.datasource is not None: + self.datasource_changed = True + self.prev_datasource = self.context.datasource + self.context.datasource = self.datasource + if 'where' in node: + 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']) + self.datasource = copy.copy(self.datasource) # shallow copy + self.datasource.groupinfo = self.group_node + else: + self.group_node = None + + 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 + cexprs = [] + flatten = False + cols = [] + self.out_table = TableInfo('out_'+base62uuid(4), [], self.context) + if 'outfile' in node: + flatten = True + + new_names = [] + for i, proj in enumerate(self.projections): + cname = '' + compound = False + 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 + 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) + 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 self.datasource.rec not in self.group_node.referenced + self.datasource.rec = None + 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) + + if has_groupby: + create_table(self, self.out_table) + self.group_node.finalize(cexprs, self.out_table) + else: + create_table(self, self.out_table, cexpr = cexprs) + self.datasource.group_node = None + + if self.where is not None: + self.where.finalize() + + has_orderby = 'orderby' in node + if has_orderby: + self.datasource = self.out_table + self.context.datasource = self.out_table # discard current ds + orderby_node = orderby(self, node['orderby']) + self.emit(f'auto {disp_varname} ={self.out_table.reference()}->order_by_view<{",".join([f"{c}" for c in orderby_node.col_list])}>();') + else: + disp_varname = f'*{self.out_table.cxt_name}' + if self.disp: + self.emit(f'print({disp_varname});') + + + 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: + self.context.datasource = self.prev_datasource + + +import sys +include(sys.modules[__name__]) \ No newline at end of file diff --git a/msvs-py/msvs-py.pyproj b/msvs-py/msvs-py.pyproj new file mode 100644 index 0000000..67fab2a --- /dev/null +++ b/msvs-py/msvs-py.pyproj @@ -0,0 +1,90 @@ + + + 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 d91c898..6d056ce 100644 --- a/out.cpp +++ b/out.cpp @@ -1,12 +1,13 @@ -#include "csv.h" -#include "./server/hasher.h" #include -#include "./server/aggregations.h" #include "./server/libaquery.h" +#include "./server/hasher.h" +#include "./server/aggregations.h" +#include "csv.h" extern "C" int __DLLEXPORT__ dllmain(Context* cxt) { using namespace std; using namespace types; + auto test = new TableInfo("test", 4); cxt->tables.insert({"test", test}); auto& test_a = *(ColRef *)(&test->colrefs[0]); @@ -17,45 +18,40 @@ test_a.init(); test_b.init(); test_c.init(); test_d.init(); -io::CSVReader<4> csv_reader_53LkPG("test.csv"); -csv_reader_53LkPG.read_header(io::ignore_extra_column, "a","b","c","d"); -int tmp_43xeYChp; -int tmp_3Vnt4fLK; -int tmp_1HKZwQBO; -int tmp_6IwJuIpg; -while(csv_reader_53LkPG.read_row(tmp_43xeYChp,tmp_3Vnt4fLK,tmp_1HKZwQBO,tmp_6IwJuIpg)) { +io::CSVReader<4> csv_reader_4bTMJ9("test.csv"); +csv_reader_4bTMJ9.read_header(io::ignore_extra_column, "a","b","c","d"); +int tmp_78E1nhZJ; +int tmp_4wnHGd9t; +int tmp_5OL9GlRp; +int tmp_155GVQC6; +while(csv_reader_4bTMJ9.read_row(tmp_78E1nhZJ,tmp_4wnHGd9t,tmp_5OL9GlRp,tmp_155GVQC6)) { -test_a.emplace_back(tmp_43xeYChp); -test_b.emplace_back(tmp_3Vnt4fLK); -test_c.emplace_back(tmp_1HKZwQBO); -test_d.emplace_back(tmp_6IwJuIpg); +test_a.emplace_back(tmp_78E1nhZJ); +test_b.emplace_back(tmp_4wnHGd9t); +test_c.emplace_back(tmp_5OL9GlRp); +test_d.emplace_back(tmp_155GVQC6); } -typedef record record_type1CmZCvh; -unordered_map, transTypes> g6nov6MR; -for (uint32_t i4I = 0; i4I < test_a.size; ++i4I){ -g6nov6MR[forward_as_tuple(test_a[i4I],test_b[i4I],test_d[i4I])].emplace_back(i4I); +typedef record record_type6jn8Y49; +unordered_map, transTypes> g5gn6KEb; +for (uint32_t i3V = 0; i3V < test_a.size; ++i3V){ +g5gn6KEb[forward_as_tuple(test_a[i3V],test_b[i3V],test_d[i3V])].emplace_back(i3V); } -auto out_684r = new TableInfo,decays,decays>("out_684r", 3); -cxt->tables.insert({"out_684r", out_684r}); -auto& out_684r_sumtestc = *(ColRef> *)(&out_684r->colrefs[0]); -auto& out_684r_b = *(ColRef> *)(&out_684r->colrefs[1]); -auto& out_684r_d = *(ColRef> *)(&out_684r->colrefs[2]); -out_684r_sumtestc.init(); -out_684r_b.init(); -out_684r_d.init(); -for(auto& i3d : g6nov6MR) { -auto &key_1TaM8D7 = i3d.first; -auto &val_129np3x = i3d.second; -out_684r_sumtestc.emplace_back(sum(test_c[val_129np3x])); -out_684r_b.emplace_back(get<1>(key_1TaM8D7)); -out_684r_d.emplace_back(get<2>(key_1TaM8D7)); +auto out_4DCN = new TableInfo,value_type>,value_type>>("out_4DCN", 3); +cxt->tables.insert({"out_4DCN", out_4DCN}); +auto& out_4DCN_sumtestc = *(ColRef> *)(&out_4DCN->colrefs[0]); +auto& out_4DCN_b = *(ColRef>> *)(&out_4DCN->colrefs[1]); +auto& out_4DCN_d = *(ColRef>> *)(&out_4DCN->colrefs[2]); +out_4DCN_sumtestc.init(); +out_4DCN_b.init(); +out_4DCN_d.init(); +for(auto& i1s : g5gn6KEb) { +auto &key_4Q0aEyH = i1s.first; +auto &val_7BUMR6d = i1s.second; +out_4DCN_sumtestc.emplace_back(sum(test_c[val_7BUMR6d])); +out_4DCN_b.emplace_back(get<1>(key_4Q0aEyH)); +out_4DCN_d.emplace_back(get<2>(key_4Q0aEyH)); } -auto d2X3bP6l =out_684r->order_by_view<-3,1>(); -puts("a"); -print(*(out_684r->order_by<-3,1>())); -puts("b"); -print(out_684r->order_by_view<-3,1>()); -puts("e"); -print(*out_684r); +auto d6X0PMzl =out_4DCN->order_by_view<-3,1>(); +print(d6X0PMzl); 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/server/aggregations.h b/server/aggregations.h index 71de8aa..8bd79b5 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(); @@ -91,15 +91,44 @@ VT maxw(const VT& arr, uint32_t w) { } 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(arr.size) + 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(arr.size) + 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 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 index ad7835b..43be108 100644 --- a/server/io.h +++ b/server/io.h @@ -2,14 +2,14 @@ #include "types.h" #include #include -#include -#include template std::string generate_printf_string(const char* sep = " ", const char* end = "\n") { std::string str; - (void)std::initializer_list{ - (str += types::printf_str[types::Types::getType()], str += sep, 0)... - }; + ((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/server.cpp b/server/server.cpp index fe06af1..934cfe1 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -98,7 +98,7 @@ int _main() } dlclose(handle); } - static_assert(std::is_same_v()), std::integer_sequence>, ""); + //static_assert(std::is_same_v()), std::integer_sequence>, ""); return 0; } diff --git a/server/server.sln b/server/server.sln index 598688f..d22be11 100644 --- a/server/server.sln +++ b/server/server.sln @@ -10,30 +10,48 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server", "server.vcxproj", EndProject 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 03f1f79..92de8fb 100644 --- a/server/server.vcxproj +++ b/server/server.vcxproj @@ -167,6 +167,7 @@ + diff --git a/server/table.h b/server/table.h index ffbe96b..49ce40c 100644 --- a/server/table.h +++ b/server/table.h @@ -6,6 +6,8 @@ #include "types.h" #include "vector_type.hpp" #include +#include +#include "io.h" template class vector_type; template <> @@ -26,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; } @@ -37,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(); }; @@ -44,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; @@ -77,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