| Index: golden/go/ignore/sqlignorestore.go
|
| diff --git a/golden/go/ignore/sqlignorestore.go b/golden/go/ignore/sqlignorestore.go
|
| index b96457f5be78b91b9513f1425d5305875271e775..00cd40cdf07a983e154613556bf0abdd6b6d30b8 100644
|
| --- a/golden/go/ignore/sqlignorestore.go
|
| +++ b/golden/go/ignore/sqlignorestore.go
|
| @@ -15,11 +15,12 @@ import (
|
| )
|
|
|
| type SQLIgnoreStore struct {
|
| - vdb *database.VersionedDB
|
| - mutex sync.Mutex
|
| - revision int64
|
| - tileStream <-chan *types.TilePair
|
| - expStore expstorage.ExpectationsStore
|
| + vdb *database.VersionedDB
|
| + mutex sync.Mutex
|
| + revision int64
|
| + tileStream <-chan *types.TilePair
|
| + lastTilePair *types.TilePair
|
| + expStore expstorage.ExpectationsStore
|
| }
|
|
|
| // NewSQLIgnoreStore creates a new SQL based IgnoreStore.
|
| @@ -133,25 +134,37 @@ func (m *SQLIgnoreStore) addIgnoreCounts(rules []*IgnoreRule) error {
|
| select {
|
| case tilePair = <-m.tileStream:
|
| default:
|
| + tilePair = m.lastTilePair
|
| }
|
| if tilePair == nil {
|
| return fmt.Errorf("No tile available to count ignores")
|
| }
|
| + m.lastTilePair = tilePair
|
|
|
| // Count the untriaged digests in HEAD.
|
| + // matchingDigests[rule.ID]map[digest]bool
|
| matchingDigests := make(map[int]map[string]bool, len(rules))
|
| + rulesByDigest := map[string]map[int]bool{}
|
| for _, trace := range tilePair.TileWithIgnores.Traces {
|
| gTrace := trace.(*types.GoldenTrace)
|
| if matchRules, ok := ignoreMatcher(gTrace.Params_); ok {
|
| testName := gTrace.Params_[types.PRIMARY_KEY_FIELD]
|
| - if digest := gTrace.LastDigest(); digest != "" && (exp.Classification(testName, digest) == types.UNTRIAGED) {
|
| + if digest := gTrace.LastDigest(); digest != types.MISSING_DIGEST && (exp.Classification(testName, digest) == types.UNTRIAGED) {
|
| k := testName + ":" + digest
|
| for _, r := range matchRules {
|
| + // Add the digest to all matching rules.
|
| if t, ok := matchingDigests[r.ID]; ok {
|
| t[k] = true
|
| } else {
|
| matchingDigests[r.ID] = map[string]bool{k: true}
|
| }
|
| +
|
| + // Add the rule to the test-digest.
|
| + if t, ok := rulesByDigest[k]; ok {
|
| + t[r.ID] = true
|
| + } else {
|
| + rulesByDigest[k] = map[int]bool{r.ID: true}
|
| + }
|
| }
|
| }
|
| }
|
| @@ -159,6 +172,13 @@ func (m *SQLIgnoreStore) addIgnoreCounts(rules []*IgnoreRule) error {
|
|
|
| for _, r := range rules {
|
| r.Count = len(matchingDigests[r.ID])
|
| + r.ExclusiveCount = 0
|
| + for testDigestKey := range matchingDigests[r.ID] {
|
| + // If exactly this one rule matches then account for it.
|
| + if len(rulesByDigest[testDigestKey]) == 1 {
|
| + r.ExclusiveCount++
|
| + }
|
| + }
|
| }
|
| return nil
|
| }
|
|
|