fix: return all search-based results if no syntactic provenance is requested (#64330)

Closes
https://linear.app/sourcegraph/issue/GRAPH-797/return-all-search-based-results-if-syntactic-is-not-requested

Making sum-types like a caveman...

## Test plan

Manual testing via API. I can't make the web app do a search-based
usages request at the moment.
This commit is contained in:
Christoph Hegemann 2024-08-13 10:52:56 +02:00 committed by GitHub
parent 70aa6908ea
commit a80ad938ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 61 additions and 28 deletions

View File

@ -1208,6 +1208,34 @@ func languageFromFilepath(trace observation.TraceLogger, path core.RepoRelPath)
return langs[0], nil
}
type SearchBasedSyntacticFilterTag int
const (
// There was a previous syntactic search in this request, reuse some of the data it resolved to filter out
// syntactic results
SBSFilterSyntacticPrevious SearchBasedSyntacticFilterTag = iota
// There wasn't a previous syntactic search in this request, but we should still filter out syntactic results
SBSFilterSyntacticNoPrevious
// Do not filter out syntactic results
SBSFilterSyntacticDont
)
type SearchBasedSyntacticFilter struct {
Tag SearchBasedSyntacticFilterTag
PreviousSearch PreviousSyntacticSearch
}
func NewSyntacticFilter(prev core.Option[PreviousSyntacticSearch]) SearchBasedSyntacticFilter {
if p, isSome := prev.Get(); isSome {
return SearchBasedSyntacticFilter{Tag: SBSFilterSyntacticPrevious, PreviousSearch: p}
}
return SearchBasedSyntacticFilter{Tag: SBSFilterSyntacticNoPrevious, PreviousSearch: PreviousSyntacticSearch{}}
}
func NoSyntacticFilter() SearchBasedSyntacticFilter {
return SearchBasedSyntacticFilter{Tag: SBSFilterSyntacticDont, PreviousSearch: PreviousSyntacticSearch{}}
}
type SearchBasedUsagesResult struct {
Matches []SearchBasedMatch
NextCursor core.Option[UsagesCursor]
@ -1217,7 +1245,7 @@ func (s *Service) SearchBasedUsages(
ctx context.Context,
gitTreeTranslator GitTreeTranslator,
args UsagesForSymbolArgs,
previousSyntacticSearch core.Option[PreviousSyntacticSearch],
syntacticFilter SearchBasedSyntacticFilter,
) (_ SearchBasedUsagesResult, err error) {
ctx, trace, endObservation := s.operations.searchBasedUsages.With(ctx, &err, observation.Args{Attrs: []attribute.KeyValue{
attribute.Int("repoId", int(args.Repo.ID)),
@ -1230,28 +1258,27 @@ func (s *Service) SearchBasedUsages(
var language string
var symbolName string
var syntacticIndex core.Option[MappedIndex]
if prev, ok := previousSyntacticSearch.Get(); ok {
language = prev.Language
symbolName = prev.SymbolName
syntacticIndex = core.Some[MappedIndex](prev.MappedIndex)
if syntacticFilter.Tag == SBSFilterSyntacticPrevious {
language = syntacticFilter.PreviousSearch.Language
symbolName = syntacticFilter.PreviousSearch.SymbolName
syntacticIndex = core.Some[MappedIndex](syntacticFilter.PreviousSearch.MappedIndex)
} else {
language, err = languageFromFilepath(trace, args.Path)
if err != nil {
return SearchBasedUsagesResult{}, err
}
nameFromGit, err := s.symbolNameFromGit(ctx, args)
if err != nil {
return SearchBasedUsagesResult{}, err
}
symbolName = nameFromGit
upload, uploadErr := s.getSyntacticUpload(ctx, trace, args)
if uploadErr != nil {
trace.Info("no syntactic upload found, return all search-based results", log.Error(err))
} else {
syntacticIndex = core.Some[MappedIndex](NewMappedIndexFromTranslator(s.lsifstore, gitTreeTranslator, upload, args.Commit))
if syntacticFilter.Tag == SBSFilterSyntacticNoPrevious {
upload, uploadErr := s.getSyntacticUpload(ctx, trace, args)
if uploadErr != nil {
trace.Info("no syntactic upload found, return all search-based results", log.Error(err))
} else {
syntacticIndex = core.Some[MappedIndex](NewMappedIndexFromTranslator(s.lsifstore, gitTreeTranslator, upload, args.Commit))
}
}
}
return searchBasedUsagesImpl(ctx, trace, s.searchClient, args, symbolName, language, syntacticIndex)

View File

@ -32,7 +32,7 @@ type CodeNavService interface {
// Subsequent calls can pass the returned cursor (if non-empty) via args.Cursor.
PreciseUsages(ctx context.Context, requestState codenav.RequestState, args codenav.UsagesForSymbolResolvedArgs) (_ []shared.UploadUsage, nextCursor core.Option[codenav.UsagesCursor], err error)
SyntacticUsages(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs) (codenav.SyntacticUsagesResult, *codenav.SyntacticUsagesError)
SearchBasedUsages(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error)
SearchBasedUsages(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error)
}
var _ CodeNavService = &codenav.Service{}

View File

@ -289,7 +289,7 @@ func NewMockCodeNavService() *MockCodeNavService {
},
},
SearchBasedUsagesFunc: &CodeNavServiceSearchBasedUsagesFunc{
defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (r0 codenav.SearchBasedUsagesResult, r1 error) {
defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (r0 codenav.SearchBasedUsagesResult, r1 error) {
return
},
},
@ -371,7 +371,7 @@ func NewStrictMockCodeNavService() *MockCodeNavService {
},
},
SearchBasedUsagesFunc: &CodeNavServiceSearchBasedUsagesFunc{
defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) {
defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) {
panic("unexpected invocation of MockCodeNavService.SearchBasedUsages")
},
},
@ -1728,15 +1728,15 @@ func (c CodeNavServiceSCIPDocumentFuncCall) Results() []interface{} {
// SearchBasedUsages method of the parent MockCodeNavService instance is
// invoked.
type CodeNavServiceSearchBasedUsagesFunc struct {
defaultHook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error)
hooks []func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error)
defaultHook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error)
hooks []func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error)
history []CodeNavServiceSearchBasedUsagesFuncCall
mutex sync.Mutex
}
// SearchBasedUsages delegates to the next hook function in the queue and
// stores the parameter and result values of this invocation.
func (m *MockCodeNavService) SearchBasedUsages(v0 context.Context, v1 codenav.GitTreeTranslator, v2 codenav.UsagesForSymbolArgs, v3 core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) {
func (m *MockCodeNavService) SearchBasedUsages(v0 context.Context, v1 codenav.GitTreeTranslator, v2 codenav.UsagesForSymbolArgs, v3 codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) {
r0, r1 := m.SearchBasedUsagesFunc.nextHook()(v0, v1, v2, v3)
m.SearchBasedUsagesFunc.appendCall(CodeNavServiceSearchBasedUsagesFuncCall{v0, v1, v2, v3, r0, r1})
return r0, r1
@ -1745,7 +1745,7 @@ func (m *MockCodeNavService) SearchBasedUsages(v0 context.Context, v1 codenav.Gi
// SetDefaultHook sets function that is called when the SearchBasedUsages
// method of the parent MockCodeNavService instance is invoked and the hook
// queue is empty.
func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error)) {
func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error)) {
f.defaultHook = hook
}
@ -1754,7 +1754,7 @@ func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultHook(hook func(context.C
// invokes the hook at the front of the queue and discards it. After the
// queue is empty, the default hook function is invoked for any future
// action.
func (f *CodeNavServiceSearchBasedUsagesFunc) PushHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error)) {
func (f *CodeNavServiceSearchBasedUsagesFunc) PushHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error)) {
f.mutex.Lock()
f.hooks = append(f.hooks, hook)
f.mutex.Unlock()
@ -1763,19 +1763,19 @@ func (f *CodeNavServiceSearchBasedUsagesFunc) PushHook(hook func(context.Context
// SetDefaultReturn calls SetDefaultHook with a function that returns the
// given values.
func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultReturn(r0 codenav.SearchBasedUsagesResult, r1 error) {
f.SetDefaultHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) {
f.SetDefaultHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) {
return r0, r1
})
}
// PushReturn calls PushHook with a function that returns the given values.
func (f *CodeNavServiceSearchBasedUsagesFunc) PushReturn(r0 codenav.SearchBasedUsagesResult, r1 error) {
f.PushHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) {
f.PushHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) {
return r0, r1
})
}
func (f *CodeNavServiceSearchBasedUsagesFunc) nextHook() func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) {
func (f *CodeNavServiceSearchBasedUsagesFunc) nextHook() func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) {
f.mutex.Lock()
defer f.mutex.Unlock()
@ -1820,7 +1820,7 @@ type CodeNavServiceSearchBasedUsagesFuncCall struct {
Arg2 codenav.UsagesForSymbolArgs
// Arg3 is the value of the 4th argument passed to this method
// invocation.
Arg3 core.Option[codenav.PreviousSyntacticSearch]
Arg3 codenav.SearchBasedSyntacticFilter
// Result0 is the value of the 1st result returned from this method
// invocation.
Result0 codenav.SearchBasedUsagesResult

View File

@ -304,8 +304,14 @@ func (r *rootResolver) UsagesForSymbol(ctx context.Context, unresolvedArgs *reso
Path: args.Path,
SymbolRange: args.Range,
}
var syntacticFilter codenav.SearchBasedSyntacticFilter
if provsForSCIPData.Syntactic {
syntacticFilter = codenav.NewSyntacticFilter(previousSyntacticSearch)
} else {
syntacticFilter = codenav.NoSyntacticFilter()
}
nextSearchBasedCursor, searchBasedUsageResolvers := r.searchBasedUsages(
ctx, trace, gitTreeTranslator, usagesForSymbolArgs, previousSyntacticSearch,
ctx, trace, gitTreeTranslator, usagesForSymbolArgs, syntacticFilter,
)
usageResolvers = append(usageResolvers, searchBasedUsageResolvers...)
numSearchBasedResults = len(searchBasedUsageResolvers)
@ -392,9 +398,9 @@ func (r *rootResolver) syntacticUsages(
func (r *rootResolver) searchBasedUsages(
ctx context.Context, trace observation.TraceLogger, gitTreeTranslator codenav.GitTreeTranslator,
args codenav.UsagesForSymbolArgs, previousSyntacticSearch core.Option[codenav.PreviousSyntacticSearch],
args codenav.UsagesForSymbolArgs, syntacticFilter codenav.SearchBasedSyntacticFilter,
) (core.Option[codenav.UsagesCursor], []resolverstubs.UsageResolver) {
result, err := r.svc.SearchBasedUsages(ctx, gitTreeTranslator, args, previousSyntacticSearch)
result, err := r.svc.SearchBasedUsages(ctx, gitTreeTranslator, args, syntacticFilter)
if err != nil {
trace.Error("CodeNavService.SearchBasedUsages", log.Error(err))
return core.None[codenav.UsagesCursor](), nil