-
Notifications
You must be signed in to change notification settings - Fork 385
/
statistics.go
58 lines (48 loc) · 1.59 KB
/
statistics.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
// Copyright 2021 FerretDB Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package stages
import "github.com/FerretDB/FerretDB/internal/handlers/common/aggregations"
// Statistic represents a statistic that can be fetched from the DB.
type Statistic int32
// List of statistics that can be fetched from the DB.
const (
_ Statistic = iota
StatisticCount
StatisticLatency
StatisticQueryExec
StatisticStorage
)
// GetStatistics has the same idea as GetPushdownQuery: it returns a list of statistics that need
// to be fetched from the DB, because they are needed for one or more stages.
func GetStatistics(stages []aggregations.Stage) map[Statistic]struct{} {
stats := make(map[Statistic]struct{}, len(stages))
for _, stage := range stages {
switch st := stage.(type) {
case *collStats:
if st.count {
stats[StatisticCount] = struct{}{}
}
if st.latencyStats {
stats[StatisticLatency] = struct{}{}
}
if st.queryExecStats {
stats[StatisticQueryExec] = struct{}{}
}
if st.storageStats != nil {
stats[StatisticStorage] = struct{}{}
}
}
}
return stats
}