From b9a8ad3ac7fbd50a9dd22b5c02a955e68cc30600 Mon Sep 17 00:00:00 2001 From: BillSun Date: Fri, 11 Feb 2022 08:06:42 -0500 Subject: [PATCH] Group by Flatten Rewritten Agg funcs and csv I/O bug fixes --- .gitignore | 3 ++ csv.dylib | Bin 0 -> 37784 bytes engine/ast.py | 21 +++++++-- engine/ddl.py | 34 ++++++++++++--- engine/expr.py | 17 +++++++- engine/groupby.py | 25 +++++++++-- engine/orderby.py | 38 +++++++++++++++++ engine/projection.py | 63 +++++++++++++-------------- header.k | 8 +++- mmw.cpp | 7 +-- mmw.dylib | Bin 0 -> 66520 bytes mmw.so | Bin moving_avg.a | 3 ++ nyctx100.csv | 99 +++++++++++++++++++++++++++++++++++++++++++ prompt.py | 17 ++++++-- test.csv | 11 +++++ 16 files changed, 285 insertions(+), 61 deletions(-) create mode 100755 csv.dylib create mode 100644 engine/orderby.py create mode 100755 mmw.dylib mode change 100644 => 100755 mmw.so create mode 100755 nyctx100.csv create mode 100755 test.csv diff --git a/.gitignore b/.gitignore index dc09fca..6a0c445 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,9 @@ k *.pdf test*.c* *.csv +!test.csv +!moving_avg.csv +!nyctx100.csv *.out *.asm !mmw.so diff --git a/csv.dylib b/csv.dylib new file mode 100755 index 0000000000000000000000000000000000000000..3dc33e4f338242f8d485f594e61c0296e2251264 GIT binary patch literal 37784 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 0 and x[-1]==';' else x for i, c in enumerate(out_table.columns): - self.emit_no_ln(f"{c.name}:{c.k9name}{';' if i < len(out_table.columns) - 1 else ''}") - self.emit(']') + c:ColRef + l_keys += '`' + c.name + if c.compound: + if l_compound: + l_cols=f'flatBOTH\'+(({ending(l_cols)});{c.k9name})' + else: + l_compound = True + if i >= 1: + l_cols = f'flatRO\'+(({ending(l_cols)});{c.k9name})' + else: + l_cols = c.k9name + ';' + elif l_compound: + l_cols = f'flatLO\'+(({ending(l_cols)});{c.k9name})' + else: + l_cols += f"{c.k9name};" + 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('))') import sys include(sys.modules[__name__]) \ No newline at end of file diff --git a/engine/expr.py b/engine/expr.py index 7c41776..5432bc0 100644 --- a/engine/expr.py +++ b/engine/expr.py @@ -32,6 +32,9 @@ class expr(ast_node): 'neg' : '-', 'not' : '~' } + coumpound_generating_ops = ['mod', 'mins', 'maxs', 'sums'] + \ + list( binary_ops.keys()) + list(compound_ops.keys()) + list(unary_ops.keys() ) + def __init__(self, parent, node): ast_node.__init__(self, parent, node, None) @@ -39,6 +42,7 @@ class expr(ast_node): from engine.projection import projection parent = self.parent self.isvector = parent.isvector if type(parent) is expr else False + self.is_compound = parent.is_compound if type(parent) is expr else False if type(parent) in [projection, expr]: self.datasource = parent.datasource else: @@ -59,7 +63,9 @@ class expr(ast_node): for i, p in enumerate(val): self.k9expr += expr(self, p).k9expr + (';'if i 1: - self.emit(f"+{disp_varname}") + self.emit(f"{'+' if self.inv else ''}{disp_varname}") else: - self.emit(f'+,(,{disp_varname})') + self.emit(f'$[(#{disp_varname})>1;+,({disp_varname});+,(,{disp_varname})]') if flatten: self.emit(f'{disp_varname}') if flatten: diff --git a/header.k b/header.k index f0df0c2..7be225d 100644 --- a/header.k +++ b/header.k @@ -50,11 +50,15 @@ groupby:{[L] 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:{[L;w] $[(#L)=0;L;(sumswkrl[L;w])\@[!#L;0;L[0]]]} +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:{[L;w] $[(#L)=0;L;(avgswkrl[L;w])\@[!#L;0;L[0]]]} +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 diff --git a/mmw.cpp b/mmw.cpp index 33f15ae..6ff7226 100644 --- a/mmw.cpp +++ b/mmw.cpp @@ -1,17 +1,12 @@ - -#include -#include #include #include -using std::size_t; using std::uint32_t; template void running(void *array, uint32_t len, uint32_t w){ - using std::deque; T* arr = static_cast (array); - deque> cache; + std::deque> cache; for(int i = 0; i < len; ++i){ if(!cache.empty() && cache.front().second == i-w) cache.pop_front(); if constexpr(minmax) diff --git a/mmw.dylib b/mmw.dylib new file mode 100755 index 0000000000000000000000000000000000000000..dea9d80da2b735e36ea852f952249a7dc9c98b2a GIT binary patch literal 66520 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