optimize: log parser

add: fast text reader to log parser
This commit is contained in:
Inanc Gumus
2019-08-07 13:24:15 +03:00
parent 450018748b
commit 4b2d2a3d6b
6 changed files with 168 additions and 49 deletions

View File

@@ -17,6 +17,7 @@ type report struct {
func newReport() *report {
return &report{
filter: noopFilter,
group: noopGrouper,
input: textReader(os.Stdin),
output: textWriter(os.Stdout),
}
@@ -43,30 +44,19 @@ func (r *report) groupBy(fn groupFunc) *report {
}
func (r *report) start() ([]result, error) {
if r.input == nil {
panic("report input cannot be nil")
}
// input filterBy groupBy
// scanner (result) bool map[string]result
//
// stdin -> []result -> []results -> []result -> output(stdout)
results, err := r.input()
res, err := r.input()
if err != nil {
return nil, err
}
// noop if filter is nil
results = filterBy(results, r.filter)
res = filterBy(res, r.filter)
res = groupBy(res, r.group)
err = r.output(res)
// group func is more tricky
// you don't want to create an unnecessary map
if r.group != nil {
results = groupBy(results, r.group)
}
// TODO: prefer: noop writer
if r.output != nil {
if err := r.output(results); err != nil {
return nil, err
}
}
return results, nil
return res, err
}