/
metric.go
146 lines (132 loc) · 4.62 KB
/
metric.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package fixtures
import (
"context"
"github.com/rotisserie/eris"
"gorm.io/gorm"
"github.com/G-Research/fasttrackml/pkg/api/mlflow/dao/models"
"github.com/G-Research/fasttrackml/pkg/api/mlflow/dao/repositories"
"github.com/G-Research/fasttrackml/pkg/database"
)
// MetricFixtures represents data fixtures object.
type MetricFixtures struct {
baseFixtures
metricRepository repositories.MetricRepositoryProvider
}
// NewMetricFixtures creates new instance of MetricFixtures.
func NewMetricFixtures(db *gorm.DB) (*MetricFixtures, error) {
return &MetricFixtures{
baseFixtures: baseFixtures{db: db},
metricRepository: repositories.NewMetricRepository(db),
}, nil
}
// CreateMetric creates new test Metric.
func (f MetricFixtures) CreateMetric(ctx context.Context, metric *models.Metric) (*models.Metric, error) {
defaultContext := models.DefaultContext
if err := f.baseFixtures.db.WithContext(
ctx,
).FirstOrCreate(
&defaultContext, defaultContext,
).Error; err != nil {
return nil, eris.Wrap(err, "error creating or finding default context")
}
if metric.Context.Json == nil {
metric.Context = defaultContext
} else {
if err := f.baseFixtures.db.WithContext(
ctx,
).FirstOrCreate(
&metric.Context, metric.Context,
).Error; err != nil {
return nil, eris.Wrap(err, "error creating metric context")
}
}
if err := f.baseFixtures.db.WithContext(ctx).Create(metric).Error; err != nil {
return nil, eris.Wrap(err, "error creating metric")
}
return metric, nil
}
// GetMetricsByRunID returns the metrics by Run ID.
func (f MetricFixtures) GetMetricsByRunID(ctx context.Context, runID string) ([]*models.Metric, error) {
var metrics []*models.Metric
if err := f.db.WithContext(ctx).Where(
"run_uuid = ?", runID,
).Find(&metrics).Error; err != nil {
return nil, eris.Wrapf(err, "error getting metric by run_uuid: %v", runID)
}
return metrics, nil
}
// GetMetricsByContext returns metric by a context partial match.
func (f MetricFixtures) GetMetricsByContext(
ctx context.Context,
metricContext map[string]string,
) ([]*models.Metric, error) {
var metrics []*models.Metric
tx := f.db.WithContext(ctx).Model(
&database.Metric{},
).Joins(
"LEFT JOIN contexts ON metrics.context_id = contexts.id",
)
sql, args := repositories.BuildJsonCondition(tx.Dialector.Name(), "contexts.json", metricContext)
if err := tx.Where(sql, args...).Find(&metrics).Error; err != nil {
return nil, eris.Wrapf(err, "error getting metrics by context: %v", metricContext)
}
return metrics, nil
}
// CreateLatestMetric creates new test Latest Metric.
func (f MetricFixtures) CreateLatestMetric(
ctx context.Context, metric *models.LatestMetric,
) (*models.LatestMetric, error) {
defaultContext := models.DefaultContext
if err := f.baseFixtures.db.WithContext(
ctx,
).FirstOrCreate(
&defaultContext, defaultContext,
).Error; err != nil {
return nil, eris.Wrap(err, "error creating or finding default context")
}
if metric.Context.Json == nil {
metric.Context = defaultContext
} else {
if err := f.baseFixtures.db.WithContext(
ctx,
).FirstOrCreate(
&metric.Context, metric.Context,
).Error; err != nil {
return nil, eris.Wrap(err, "error creating metric context")
}
}
if err := f.baseFixtures.db.WithContext(ctx).Create(metric).Error; err != nil {
return nil, eris.Wrap(err, "error creating latest metric")
}
return metric, nil
}
// GetLatestMetricByKey returns the latest metric by provided key.
func (f MetricFixtures) GetLatestMetricByKey(ctx context.Context, key string) (*models.LatestMetric, error) {
var metric models.LatestMetric
if err := f.db.WithContext(ctx).Preload("Context").Where(
"key = ?", key,
).First(&metric).Error; err != nil {
return nil, eris.Wrapf(err, "error getting latest metric by key: %v", key)
}
return &metric, nil
}
// GetLatestMetricsByKey returns the latest metrics by provided key.
func (f MetricFixtures) GetLatestMetricsByKey(ctx context.Context, key string) ([]models.LatestMetric, error) {
var metrics []models.LatestMetric
if err := f.db.WithContext(ctx).Preload("Context").Where(
"key = ?", key,
).Find(&metrics).Error; err != nil {
return nil, eris.Wrapf(err, "error getting latest metrics by key: %v", key)
}
return metrics, nil
}
// GetLatestMetricByRunID returns the latest metric by provide Run ID.
func (f MetricFixtures) GetLatestMetricByRunID(ctx context.Context, runID string) (*models.LatestMetric, error) {
var metric models.LatestMetric
if err := f.db.WithContext(ctx).Preload("Context").Where(
"run_uuid = ?", runID,
).First(&metric).Error; err != nil {
return nil, eris.Wrapf(err, "error getting latest metric by run_uuid: %v", runID)
}
return &metric, nil
}