123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package searcher
- import (
- "testing"
-
- "github.com/stretchr/testify/assert"
- )
- func TestMergeSingleFacet_UniqueTermsCount(t *testing.T) {
- ds := &DistributedSearcher{}
-
- // Create initial facet with some terms from shard 1
- existing := &Facet{
- Field: "path_exact",
- Total: 3, // Initial count of unique terms
- Missing: 5,
- Other: 10,
- Terms: []*FacetTerm{
- {Term: "/api/users", Count: 100},
- {Term: "/api/posts", Count: 80},
- {Term: "/home", Count: 60},
- },
- }
-
- // Create incoming facet from shard 2
- // Has some overlapping terms and some new terms
- incoming := &Facet{
- Field: "path_exact",
- Total: 4, // Should NOT be added to existing.Total
- Missing: 3,
- Other: 8,
- Terms: []*FacetTerm{
- {Term: "/api/users", Count: 50}, // Overlapping
- {Term: "/api/posts", Count: 30}, // Overlapping
- {Term: "/login", Count: 40}, // New
- {Term: "/dashboard", Count: 35}, // New
- },
- }
-
- // Merge the facets
- ds.mergeSingleFacet(existing, incoming)
-
- // Verify the results
- assert.Equal(t, "path_exact", existing.Field)
-
- // Total should be the count of unique terms after merging, NOT the sum
- // We have 5 unique terms: /api/users, /api/posts, /home, /login, /dashboard
- assert.Equal(t, 5, existing.Total, "Total should be the count of unique terms, not sum of totals")
-
- // Missing and Other should be summed
- assert.Equal(t, 8, existing.Missing)
- assert.Equal(t, 18, existing.Other)
-
- // Verify term counts are merged correctly
- termMap := make(map[string]int)
- for _, term := range existing.Terms {
- termMap[term.Term] = term.Count
- }
-
- assert.Equal(t, 150, termMap["/api/users"], "Count should be 100+50")
- assert.Equal(t, 110, termMap["/api/posts"], "Count should be 80+30")
- assert.Equal(t, 60, termMap["/home"], "Count should remain 60")
- assert.Equal(t, 40, termMap["/login"], "Count should be 40")
- assert.Equal(t, 35, termMap["/dashboard"], "Count should be 35")
- }
- func TestMergeSingleFacet_WithLimitAndOther(t *testing.T) {
- // DefaultFacetSize is 10 by default, so we'll use enough terms to exceed it
- ds := &DistributedSearcher{}
-
- existing := &Facet{
- Field: "path",
- Total: 5,
- Missing: 0,
- Other: 0,
- Terms: []*FacetTerm{
- {Term: "/page1", Count: 1000},
- {Term: "/page2", Count: 900},
- {Term: "/page3", Count: 800},
- {Term: "/page4", Count: 700},
- {Term: "/page5", Count: 600},
- },
- }
-
- incoming := &Facet{
- Field: "path",
- Total: 8,
- Missing: 0,
- Other: 0,
- Terms: []*FacetTerm{
- {Term: "/page1", Count: 500},
- {Term: "/page6", Count: 550},
- {Term: "/page7", Count: 450},
- {Term: "/page8", Count: 400},
- {Term: "/page9", Count: 350},
- {Term: "/page10", Count: 300},
- {Term: "/page11", Count: 250},
- {Term: "/page12", Count: 200},
- },
- }
-
- ds.mergeSingleFacet(existing, incoming)
-
- // Total should be 12 unique paths (page1-5 from existing, page6-12 from incoming)
- assert.Equal(t, 12, existing.Total, "Should have 12 unique paths")
-
- // DefaultFacetSize is 10, so we should keep top 10 terms
- assert.Equal(t, 10, len(existing.Terms), "Should keep top 10 terms (DefaultFacetSize)")
-
- // Verify top terms are correct
- assert.Equal(t, "/page1", existing.Terms[0].Term)
- assert.Equal(t, 1500, existing.Terms[0].Count) // 1000 + 500
- assert.Equal(t, "/page2", existing.Terms[1].Term)
- assert.Equal(t, 900, existing.Terms[1].Count)
- assert.Equal(t, "/page3", existing.Terms[2].Term)
- assert.Equal(t, 800, existing.Terms[2].Count)
-
- // Other should contain the sum of excluded terms (page11: 250, page12: 200)
- assert.Equal(t, 450, existing.Other, "Other should contain sum of excluded terms")
- }
|