Exclude excluded patterns from merge and adoption

Filter excluded and non-exact patterns in SQL when loading
patterns for the pattern analysis worker. Both merge group
building and uncategorised adoption only see non-excluded
exact patterns, so excluded patterns are preserved as
punch-out overrides.

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-05-01 16:32:05 +04:00
parent dc3c2701ac
commit bfc0ded464
2 changed files with 13 additions and 38 deletions

View File

@@ -85,12 +85,18 @@ func (h *patternAnalysisHandler) Process(ctx context.Context, banner coredata.Co
func(ctx context.Context, tx pg.Tx) error { func(ctx context.Context, tx pg.Tx) error {
scope := coredata.NewScopeFromObjectID(banner.ID) scope := coredata.NewScopeFromObjectID(banner.ID)
var patterns coredata.CookiePatterns var exactPatterns coredata.CookiePatterns
if err := patterns.LoadAllByCookieBannerID(ctx, tx, scope, banner.ID, nil); err != nil { if err := exactPatterns.LoadAllByCookieBannerID(
return fmt.Errorf("cannot load patterns: %w", err) ctx,
tx,
scope,
banner.ID,
coredata.NewCookiePatternFilter(new(coredata.CookiePatternMatchTypeExact), nil, new(false)),
); err != nil {
return fmt.Errorf("cannot load exact patterns: %w", err)
} }
mergeGroups := findMergeGroups(patterns, patternMergeThreshold) mergeGroups := findMergeGroups(exactPatterns, patternMergeThreshold)
merged := false merged := false
for key, group := range mergeGroups { for key, group := range mergeGroups {
@@ -176,15 +182,8 @@ func findMergeGroups(
patterns coredata.CookiePatterns, patterns coredata.CookiePatterns,
threshold int, threshold int,
) map[mergeGroupKey][]*coredata.CookiePattern { ) map[mergeGroupKey][]*coredata.CookiePattern {
var exact []*coredata.CookiePattern
for _, p := range patterns {
if p.MatchType == coredata.CookiePatternMatchTypeExact {
exact = append(exact, p)
}
}
prefixCounts := make(map[mergeGroupKey][]*coredata.CookiePattern) prefixCounts := make(map[mergeGroupKey][]*coredata.CookiePattern)
for _, p := range exact { for _, p := range patterns {
for _, pfx := range separatorPrefixes(p.Pattern) { for _, pfx := range separatorPrefixes(p.Pattern) {
key := mergeGroupKey{categoryID: p.CookieCategoryID, prefix: pfx} key := mergeGroupKey{categoryID: p.CookieCategoryID, prefix: pfx}
prefixCounts[key] = append(prefixCounts[key], p) prefixCounts[key] = append(prefixCounts[key], p)
@@ -297,14 +296,13 @@ func (h *patternAnalysisHandler) adoptUncategorisedPatterns(
return false, fmt.Errorf("cannot load uncategorised category: %w", err) return false, fmt.Errorf("cannot load uncategorised category: %w", err)
} }
prefixMatchType := coredata.CookiePatternMatchTypePrefix
var prefixPatterns coredata.CookiePatterns var prefixPatterns coredata.CookiePatterns
if err := prefixPatterns.LoadAllByCookieBannerID( if err := prefixPatterns.LoadAllByCookieBannerID(
ctx, ctx,
tx, tx,
scope, scope,
banner.ID, banner.ID,
coredata.NewCookiePatternFilter(&prefixMatchType, nil, nil), coredata.NewCookiePatternFilter(new(coredata.CookiePatternMatchTypePrefix), nil, new(false)),
); err != nil { ); err != nil {
return false, fmt.Errorf("cannot load prefix patterns: %w", err) return false, fmt.Errorf("cannot load prefix patterns: %w", err)
} }
@@ -324,7 +322,7 @@ func (h *patternAnalysisHandler) adoptUncategorisedPatterns(
tx, tx,
scope, scope,
banner.ID, banner.ID,
coredata.NewCookiePatternFilter(&exactMatchType, &uncategorised.ID, nil), coredata.NewCookiePatternFilter(&exactMatchType, &uncategorised.ID, new(false)),
); err != nil { ); err != nil {
return false, fmt.Errorf("cannot load uncategorised exact patterns: %w", err) return false, fmt.Errorf("cannot load uncategorised exact patterns: %w", err)
} }

View File

@@ -218,29 +218,6 @@ func TestFindMergeGroups(t *testing.T) {
}, },
) )
t.Run(
"skips non-exact patterns",
func(t *testing.T) {
t.Parallel()
patterns := coredata.CookiePatterns{
makePattern("ph_phc_abc123"),
makePattern("ph_phc_def456"),
makePattern("ph_phc_ghi789"),
{
Pattern: "ph_phc_",
MatchType: coredata.CookiePatternMatchTypePrefix,
},
}
groups := findMergeGroups(patterns, 3)
require.Len(t, groups, 1)
group := groups[mergeGroupKey{categoryID: gid.Nil, prefix: "ph_phc_"}]
assert.Len(t, group, 3)
},
)
t.Run( t.Run(
"leftover patterns form group under shorter prefix", "leftover patterns form group under shorter prefix",
func(t *testing.T) { func(t *testing.T) {