This repository has been archived by the owner on Mar 14, 2020. It is now read-only.
/
fastfilter.go
89 lines (75 loc) · 1.76 KB
/
fastfilter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package fastfilter
import (
"context"
"io/ioutil"
"log"
"os"
"path/filepath"
"time"
"github.com/melias122/engine/archiv"
"github.com/melias122/engine/csv"
"github.com/melias122/engine/engine"
"github.com/melias122/engine/filter"
"github.com/melias122/engine/hrx"
"github.com/melias122/engine/sieve"
)
type FastFilter struct {
sieve.Producer
filters filter.Filters
skupiny engine.Skupiny
r *result
}
func New(archiv *archiv.Archiv, sk engine.Skupiny, filters filter.Filters) *FastFilter {
startTime := time.Now().Format("2006-1-2-15-4-5")
subdir := startTime + "_FastFilter"
csvw := csv.NewCsvMaxWriter(startTime, archiv.Workdir,
csv.SetSubdir(subdir),
csv.SetSuffixFunc(csv.IntSuffix()),
csv.SetHeader(hrx.HeaderHrxHHrx),
)
os.Mkdir(filepath.Join(archiv.Workdir, subdir), 0755)
filename := filepath.Join(archiv.Workdir, subdir, "protokol.txt")
ioutil.WriteFile(filename, []byte(filters.String()), 0755)
// fast filter
var skupiny engine.Skupiny
for _, s := range sk {
if !filters.CheckSkupina(s) {
continue
}
skupiny = append(skupiny, s)
}
resultFilter := newResultFilter(csvw, archiv)
filters = append(filters, resultFilter)
return &FastFilter{
filters: filters,
skupiny: skupiny,
r: resultFilter,
}
}
func (f *FastFilter) Start(ctx context.Context) <-chan sieve.Task {
tasks := make(chan sieve.Task)
go func() {
defer close(tasks)
for _, s := range f.skupiny {
select {
case <-ctx.Done():
return
case tasks <- &task{
filters: f.filters,
skupina: s,
}:
log.Println("sending task")
}
}
}()
return tasks
}
func (f *FastFilter) Count() int {
return len(f.skupiny)
}
func (f *FastFilter) Close() error {
return f.r.Close()
}
func (f *FastFilter) Found() string {
return f.r.String()
}