/
bulk.go
87 lines (77 loc) · 1.52 KB
/
bulk.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
package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"strings"
"sync"
"time"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var BulkCmd = cobra.Command{
Use: "bulk [file]",
Short: "bulky query",
Args: cobra.ExactArgs(1),
Run: func(c *cobra.Command, args []string) {
f, err := os.Open(args[0])
if err != nil {
log.Fatal(err)
}
defer f.Close()
Bulk(viper.GetString(keyQueryString), either(f)(os.Stdin))
},
}
type Result struct {
QueryResult *QueryResult
GroupName string
}
func Bulk(qs string, r io.Reader) {
b, err := ioutil.ReadAll(r)
if err != nil {
log.Fatal(err)
}
l := strings.Split(strings.Trim(string(b), " \t\n"), "\n")
start, end := startEndTime()
checkDurationQuota(end.Sub(start) * time.Duration(len(l)))
res := make(chan *Result)
var wg sync.WaitGroup
f := func(lg string) {
res <- &Result{QueryResult: Query(qs, lg, start, end), GroupName: lg}
wg.Done()
}
for _, e := range l {
wg.Add(1)
go f(e)
}
type RT struct {
Response interface{}
GroupName string
}
a := make([]*RT, 0)
go func() {
for e := range res {
//fmt.Printf("%v\n", e)
a = append(a, &RT{
GroupName: e.GroupName,
Response: format(e.QueryResult),
})
}
}()
wg.Wait()
close(res)
type Output struct {
QueryString string
StartTime time.Time
EndTime time.Time
ResultSet []*RT
}
bb, err := json.Marshal(Output{ResultSet: a, StartTime: start, EndTime: end, QueryString: qs})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%v", string(bb))
}