-
Notifications
You must be signed in to change notification settings - Fork 0
/
norm.go
102 lines (87 loc) · 2.27 KB
/
norm.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
package entgo
import (
"context"
"github.com/google/uuid"
"github.com/tinygodsdev/orrery/internal/repository/entgo/ent/sample"
"github.com/tinygodsdev/orrery/internal/domain"
"github.com/tinygodsdev/orrery/internal/repository/entgo/ent"
"github.com/tinygodsdev/orrery/internal/repository/entgo/ent/norm"
"github.com/tinygodsdev/orrery/internal/repository/entgo/ent/scale"
)
func (r *EntgoRepository) GetScaleNorms(ctx context.Context, scaleID uuid.UUID, sampleIDs []uuid.UUID) ([]*domain.Norm, error) {
norms, err := r.client.Norm.Query().
Where(
norm.HasScaleWith(scale.IDEQ(scaleID)),
norm.BaseGTE(domain.NormMinBase),
norm.HasSampleWith(sample.IDIn(sampleIDs...)),
).
WithSample().
Order(ent.Desc(norm.FieldRank)). // we want norms with greater rank
All(ctx)
if err != nil {
return nil, err
}
var res []*domain.Norm
for _, n := range norms {
res = append(res, entToDomainNorm(n, scaleID, uuid.Nil))
}
return res, nil
}
func (r *EntgoRepository) CreateOrUpdateNorm(ctx context.Context, nrm *domain.Norm) (*domain.Norm, error) {
n, err := r.client.Norm.Query().
Where(
norm.HasScaleWith(scale.IDEQ(nrm.ScaleID)),
norm.HasSampleWith(sample.IDEQ(nrm.SampleID)),
).
Only(ctx)
if err != nil {
if !ent.IsNotFound(err) {
return nil, err
}
// norm not found, create norm
n, err := r.client.Norm.Create().
SetScaleID(nrm.ScaleID).
SetSampleID(nrm.SampleID).
SetName(nrm.Name).
SetBase(nrm.Base).
SetRank(nrm.Rank).
SetMean(nrm.Mean).
SetSigma(nrm.Sigma).
Save(ctx)
if err != nil {
return nil, err
}
return entToDomainNorm(n, nrm.ScaleID, nrm.SampleID), nil
}
// update sample
n, err = n.Update().
SetName(nrm.Name).
SetBase(nrm.Base).
SetMean(nrm.Mean).
SetRank(nrm.Rank).
SetSigma(nrm.Sigma).
Save(ctx)
if err != nil {
return nil, err
}
return entToDomainNorm(n, nrm.ScaleID, nrm.SampleID), nil
}
func entToDomainNorm(n *ent.Norm, scaleID, sampleID uuid.UUID) *domain.Norm {
if n.Edges.Scale != nil {
scaleID = n.Edges.Scale.ID
}
if n.Edges.Sample != nil {
sampleID = n.Edges.Sample.ID
}
return &domain.Norm{
ID: n.ID,
ScaleID: scaleID,
SampleID: sampleID,
Name: n.Name,
Base: n.Base,
Mean: n.Mean,
Sigma: n.Sigma,
Rank: n.Rank,
Meta: n.Meta,
}
}