Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(473)

Side by Side Diff: go/src/infra/appengine/test-results/model/merge.go

Issue 2231393002: test-results: Add merge and trim methods (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Fix typo in comment Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 package model
martiniss 2016/08/12 00:14:24 I don't see the need for a merge.go file; why don'
nishanths 2016/08/12 02:37:39 As discussed offline, will move the contents of me
nishanths 2016/08/16 01:01:53 Done in patch set 7.
2
3 import "errors"
4
5 var (
6 // ErrBuildNumberConflict is returned when the build numbers
7 // are the same when merging.
8 ErrBuildNumberConflict = errors.New("build number conflict")
martiniss 2016/08/12 00:14:24 It's not obvious to me from reading this file why
nishanths 2016/08/12 02:37:39 Done.
9
10 // ErrBuilderNameConflict is returned when the builder names
11 // do not match when merging.
12 ErrBuilderNameConflict = errors.New("builder name conflict")
13 )
14
15 // Merge merges x into ar. After merging, ar's fields may reference the same
16 // objects referenced by x.
17 func (ar *AggregateResult) Merge(x *AggregateResult) error {
martiniss 2016/08/12 00:14:24 nit: "other" is a bit more descriptive than "x".
nishanths 2016/08/12 02:37:39 Done, thanks.
18 if ar == nil {
19 return errors.New("model: Merge: nil *AggregateResult")
20 }
21 if ar.Builder != x.Builder {
22 return ErrBuilderNameConflict
23 }
24 if ar.BuilderInfo == nil {
25 ar.BuilderInfo = &BuilderInfo{}
26 }
27 ar.Version = ResultsVersion
28 return ar.BuilderInfo.Merge(x.BuilderInfo)
29 }
30
31 // Merge merges x into info. After merging, info's fields may reference the same
martiniss 2016/08/12 00:14:24 Does the reference comment matter? Would that ever
nishanths 2016/08/12 02:37:39 Removed, thanks.
32 // objects referenced by x.
33 func (info *BuilderInfo) Merge(x *BuilderInfo) error {
martiniss 2016/08/12 00:14:24 nit: "x" variable name.
nishanths 2016/08/12 02:37:39 Done: used "other".
34 if info == nil {
martiniss 2016/08/12 00:14:24 Why would info ever be nil?
nishanths 2016/08/12 02:37:39 Removed the check (also removed at similar locatio
35 return errors.New("model: Merge: nil *BuilderInfo")
36 }
37
38 if len(info.BuildNumbers) > 0 && len(x.BuildNumbers) > 0 {
39 if info.BuildNumbers[0] == x.BuildNumbers[0] {
40 return ErrBuildNumberConflict
41 }
42 }
43
44 info.SecondsEpoch = append(x.SecondsEpoch, info.SecondsEpoch...)
45 info.BlinkRevs = append(x.BlinkRevs, info.BlinkRevs...)
46 info.BuildNumbers = append(x.BuildNumbers, info.BuildNumbers...)
47 info.ChromeRevs = append(x.ChromeRevs, info.ChromeRevs...)
48
49 for k, v := range x.FailuresByType {
50 if info.FailuresByType == nil {
martiniss 2016/08/12 00:14:24 Move outside for loop.
nishanths 2016/08/12 02:37:39 Done.
51 info.FailuresByType = make(map[string][]int)
52 }
53 info.FailuresByType[k] = append(v, info.FailuresByType[k]...)
54 }
55
56 info.FailureMap = FailureLongNames
57
58 if info.Tests == nil {
59 info.Tests = AggregateTest{}
60 }
61
62 info.Tests.WalkLeaves(func(_ string, leaf *AggregateTestLeaf) {
63 leaf.Expected = nil
64 leaf.Bugs = nil
65 })
66
67 return info.Tests.Merge(x.Tests)
68 }
69
70 // Merge merges x into at. After merging, at's fields may reference the same
71 // objects referenced by x.
72 func (at *AggregateTest) Merge(x AggregateTest) error {
73 if at == nil {
74 return errors.New("model: Merge: nil *AggregateTest")
75 }
76
77 // Shallow copy but OK. We take care to not modify xcopy
78 // values; instead always create new objects
79 // and assign to xcopy[key].
80 xcopy := make(AggregateTest, len(x))
martiniss 2016/08/12 00:14:24 shouldn't this be make([]AggregateTest, len(x)) ?
nishanths 2016/08/12 02:37:39 AggregateTest is a map[string]Node.
81 for k, v := range x {
82 xcopy[k] = v
83 }
84
85 for k, v := range *at {
86 if _, ok := xcopy[k]; !ok {
87 switch v.(type) {
88 case *AggregateTestLeaf:
89 l := &AggregateTestLeaf{}
90 l.defaultFields()
91 xcopy[k] = l
92 case AggregateTest:
93 xcopy[k] = AggregateTest{}
94 }
95 }
96 }
97
98 for k, v := range xcopy {
99 // Key does not exist: assign entire subtree.
100 if _, ok := (*at)[k]; !ok {
101 if *at == nil {
102 *at = AggregateTest{}
103 }
104 (*at)[k] = v
105 continue
106 }
107
108 // Leaf node.
109 if leaf1, ok := (*at)[k].(*AggregateTestLeaf); ok {
110 leaf2, ok := v.(*AggregateTestLeaf)
111 if !ok {
112 return errors.New("model: Merge: expected *Aggre gateTestLeaf")
113 }
114 if err := leaf1.Merge(leaf2); err != nil {
115 return err
116 }
117 continue
118 }
119
120 // Not leaf node: merge subtree recursively.
121 at1, ok := (*at)[k].(AggregateTest)
122 if !ok {
123 return errors.New("model: Merge: expected AggregateTest" )
124 }
125 at2, ok := v.(AggregateTest)
126 if !ok {
127 return errors.New("model: Merge: expected AggregateTest" )
128 }
129 if err := at1.Merge(at2); err != nil {
130 return err
131 }
132 }
133
134 return nil
135 }
136
137 // Merge merges x into leaf. After merging, leaf's fields may reference the same
138 // objects referenced by x.
139 func (leaf *AggregateTestLeaf) Merge(x *AggregateTestLeaf) error {
140 if leaf == nil {
martiniss 2016/08/12 00:14:24 Same comment; seems unnecessary
nishanths 2016/08/12 02:37:39 Done, removed check.
141 return errors.New("model: Merge: nil *AggregateTestLeaf")
142 }
143
144 // Bugs and Expected should come from from x only.
145 leaf.Bugs = x.Bugs
146 if len(x.Expected) == 1 && x.Expected[0] != "PASS" {
147 leaf.Expected = x.Expected
148 }
149
150 for _, r := range x.Results {
151 if len(leaf.Results) > 0 && r.Type == leaf.Results[0].Type {
152 leaf.Results[0].Count += r.Count
153 } else {
154 leaf.Results = append([]ResultSummary{r}, leaf.Results.. .)
155 }
156 }
157
158 for _, r := range x.Runtimes {
159 if len(leaf.Runtimes) > 0 && r.Runtime == leaf.Runtimes[0].Runti me {
160 leaf.Runtimes[0].Count += r.Count
161 } else {
162 leaf.Runtimes = append([]RuntimeSummary{r}, leaf.Runtime s...)
163 }
164 }
165
166 return nil
167 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698