-
Notifications
You must be signed in to change notification settings - Fork 90
/
report_generator.go
64 lines (52 loc) · 1.73 KB
/
report_generator.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
package reporting
import (
"errors"
"fmt"
log "github.com/sirupsen/logrus"
"github.com/operator-framework/operator-metering/pkg/operator/prestostore"
)
const (
ReportingStartInputName = "ReportingStart"
ReportingEndInputName = "ReportingEnd"
)
var (
errInvalidTableName = errors.New("tableName cannot be empty")
errInvalidReportQueryName = errors.New("reportQuery cannot be empty")
errEmptyQueryField = errors.New("ReportQuery spec.query cannot be empty")
)
type ReportGenerator interface {
GenerateReport(tableName, query string, deleteExistingData bool) error
}
type reportGenerator struct {
logger log.FieldLogger
reportResultsRepo prestostore.ReportResultsRepo
}
func NewReportGenerator(logger log.FieldLogger, reportResultsRepo prestostore.ReportResultsRepo) *reportGenerator {
return &reportGenerator{
logger: logger,
reportResultsRepo: reportResultsRepo,
}
}
func (g *reportGenerator) GenerateReport(tableName, query string, deleteExistingData bool) error {
if tableName == "" {
return errInvalidTableName
}
logger := g.logger.WithFields(log.Fields{
"tableName": tableName,
})
logger.Infof("generating Report")
if deleteExistingData {
logger.Debugf("deleting any preexisting rows in %s", tableName)
err := g.reportResultsRepo.DeleteReportResults(tableName)
if err != nil {
return fmt.Errorf("couldn't empty table %s of preexisting rows: %v", tableName, err)
}
}
logger.Debugf("StoreReportResults: executing ReportQuery")
err := g.reportResultsRepo.StoreReportResults(tableName, query)
if err != nil {
logger.WithError(err).Errorf("creating usage report FAILED!")
return fmt.Errorf("Failed to execute query for Report table %s: %v", tableName, err)
}
return nil
}