Skip to content

Commit

Permalink
ByTextReference accepts many references (sourcegraph#52247)
Browse files Browse the repository at this point in the history
Part of
[sourcegraph#52133](https://github.com/sourcegraph/sourcegraph/issues/52133)

This pull request extends the Bag to take in many references at once.
This is used for search (see sourcegraph#52219) where many ownership terms are
given to include and exclude for search.

## Test plan

Small test to verify a multi-bag works.
  • Loading branch information
cbart authored May 22, 2023
1 parent 15db831 commit 2d2538f
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 9 deletions.
29 changes: 21 additions & 8 deletions enterprise/internal/own/ownref.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,28 @@ type Bag interface {
// This can be used in search to find relevant owners by different identifiers
// that the database reveals.
// TODO(#52141): Search by code host handle.
func ByTextReference(ctx context.Context, db edb.EnterpriseDB, text string) (Bag, error) {
text = strings.TrimPrefix(text, "@")
if _, err := mail.ParseAddress(text); err == nil {
return ByEmailReference(ctx, db, text)
// TODO(#52246): ByTextReference uses fewer queries.
func ByTextReference(ctx context.Context, db edb.EnterpriseDB, text ...string) (Bag, error) {
var multiBag bag
for _, t := range text {
t = strings.TrimPrefix(t, "@")
if _, err := mail.ParseAddress(t); err == nil {
b, err := ByEmailReference(ctx, db, t)
if err != nil {
return nil, err
}
multiBag = append(multiBag, b...)
}
b, err := ByUserHandleReference(ctx, db, t)
if err != nil {
return nil, err
}
multiBag = append(multiBag, b...)
}
return ByUserHandleReference(ctx, db, text)
return multiBag, nil
}

func ByUserHandleReference(ctx context.Context, db edb.EnterpriseDB, handle string) (Bag, error) {
func ByUserHandleReference(ctx context.Context, db edb.EnterpriseDB, handle string) (bag, error) {
var b bag
// Try to find a user by username.
user, err := db.Users().GetByUsername(ctx, handle)
Expand All @@ -115,7 +128,7 @@ func ByUserHandleReference(ctx context.Context, db edb.EnterpriseDB, handle stri
return hydrateWithVerifiedEmails(ctx, db, b)
}

func hydrateWithVerifiedEmails(ctx context.Context, db edb.EnterpriseDB, b bag) (Bag, error) {
func hydrateWithVerifiedEmails(ctx context.Context, db edb.EnterpriseDB, b bag) (bag, error) {
for _, userRefs := range b {
if userRefs.id == 0 {
continue
Expand All @@ -132,7 +145,7 @@ func hydrateWithVerifiedEmails(ctx context.Context, db edb.EnterpriseDB, b bag)
return b, nil
}

func ByEmailReference(ctx context.Context, db edb.EnterpriseDB, email string) (Bag, error) {
func ByEmailReference(ctx context.Context, db edb.EnterpriseDB, email string) (bag, error) {
var b bag
// Checking that provided email is verified.
verifiedEmails, err := db.UserEmails().GetVerifiedEmails(ctx, email)
Expand Down
27 changes: 26 additions & 1 deletion enterprise/internal/own/ownref_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -285,8 +285,33 @@ func TestBagUnverifiedEmailOnlyMatchesWithItself(t *testing.T) {
assert.True(t, bag.Contains(r), fmt.Sprintf("bag.Contains(%s), want true, got false", r))
} else {
assert.False(t, bag.Contains(r), fmt.Sprintf("bag.Contains(%s), want false, got true", r))

}
})
}
}

func TestBagManyUsers(t *testing.T) {
if testing.Short() {
t.Skip()
}
t.Parallel()
logger := logtest.Scoped(t)
db := edb.NewEnterpriseDB(database.NewDB(logger, dbtest.NewDB(logger, t)))
ctx := context.Background()
_, err := db.Users().Create(ctx, database.NewUser{
Email: "[email protected]",
Username: "jdoe",
EmailIsVerified: true,
})
require.NoError(t, err)
_, err = db.Users().Create(ctx, database.NewUser{
Email: "[email protected]",
Username: "ssmith",
EmailIsVerified: true,
})
require.NoError(t, err)
bag, err := ByTextReference(ctx, db, "jdoe", "ssmith")
require.NoError(t, err)
assert.True(t, bag.Contains(Reference{Handle: "ssmith"}))
assert.True(t, bag.Contains(Reference{Handle: "jdoe"}))
}

0 comments on commit 2d2538f

Please sign in to comment.