forked from caict-benchmark/BDC-TS
-
Notifications
You must be signed in to change notification settings - Fork 1
/
query.go
88 lines (75 loc) · 2.29 KB
/
query.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
package mongodb
import (
"encoding/gob"
"fmt"
"sync"
"time"
)
type S []interface{}
type M map[string]interface{}
func init() {
// needed for serializing the mongo query to gob
gob.Register(S{})
gob.Register(M{})
gob.Register([]M{})
}
// MongoQuery encodes a Mongo request. This will be serialized for use
// by the query_benchmarker program.
type MongoQuery struct {
HumanLabel []byte
HumanDescription []byte
DatabaseName []byte
CollectionName []byte
BsonDoc []M
// these are only for debugging. the data is encoded in BsonDoc.
MeasurementName []byte // e.g. "cpu"
FieldName []byte // e.g. "usage_user"
AggregationType []byte // e.g. "avg" or "sum"
TimeStart time.Time
TimeEnd time.Time
GroupByDuration time.Duration
TagSets [][]string // semantically, each subgroup is OR'ed and they are all AND'ed together
}
var MongoQueryPool sync.Pool = sync.Pool{
New: func() interface{} {
return &MongoQuery{
HumanLabel: []byte{},
HumanDescription: []byte{},
DatabaseName: []byte{},
CollectionName: []byte{},
BsonDoc: []M{},
MeasurementName: []byte{},
FieldName: []byte{},
AggregationType: []byte{},
TagSets: [][]string{},
}
},
}
func NewMongoQuery() *MongoQuery {
return MongoQueryPool.Get().(*MongoQuery)
}
// String produces a debug-ready description of a Query.
func (q *MongoQuery) String() string {
return fmt.Sprintf("HumanLabel: %s, HumanDescription: %s, MeasurementName: %s, AggregationType: %s, TimeStart: %s, TimeEnd: %s, GroupByDuration: %s, TagSets: %s", q.HumanLabel, q.HumanDescription, q.MeasurementName, q.AggregationType, q.TimeStart, q.TimeEnd, q.GroupByDuration, q.TagSets)
}
func (q *MongoQuery) HumanLabelName() []byte {
return q.HumanLabel
}
func (q *MongoQuery) HumanDescriptionName() []byte {
return q.HumanDescription
}
func (q *MongoQuery) Release() {
q.HumanLabel = q.HumanLabel[:0]
q.HumanDescription = q.HumanDescription[:0]
q.DatabaseName = q.DatabaseName[:0]
q.CollectionName = q.CollectionName[:0]
q.BsonDoc = nil
q.MeasurementName = q.MeasurementName[:0]
q.FieldName = q.FieldName[:0]
q.AggregationType = q.AggregationType[:0]
q.GroupByDuration = 0
q.TimeStart = time.Time{}
q.TimeEnd = time.Time{}
q.TagSets = q.TagSets[:0]
MongoQueryPool.Put(q)
}