// Handles requests to /index by compiling the q= parameter into a regular // expression (codesearch/regexp), searching the index for it and returning the // list of matching filenames in a JSON array. // TODO: This doesn’t handle file name regular expressions at all yet. // TODO: errors aren’t properly signaled to the requester func Index(w http.ResponseWriter, r *http.Request) { if *cpuProfile != "" { f, err := os.Create(*cpuProfile) if err != nil { log.Fatal(err) } defer f.Close() pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } r.ParseForm() textQuery := r.Form.Get("q") re, err := regexp.Compile(textQuery) if err != nil { log.Printf("regexp.Compile: %s\n", err) return } query := index.RegexpQuery(re.Syntax) log.Printf("[%s] query: text = %s, regexp = %s\n", id, textQuery, query) files := doPostingQuery(query) t2 := time.Now() if err := json.NewEncoder(w).Encode(files); err != nil { log.Printf("%s\n", err) return } t3 := time.Now() fmt.Printf("[%s] written in %v\n", id, t3.Sub(t2)) }
// Handles requests to /index by compiling the q= parameter into a regular // expression (codesearch/regexp), searching the index for it and returning the // list of matching filenames in a JSON array. // TODO: This doesn’t handle file name regular expressions at all yet. // TODO: errors aren’t properly signaled to the requester func Index(w http.ResponseWriter, r *http.Request) { if *cpuProfile != "" { f, err := os.Create(*cpuProfile) if err != nil { log.Fatal(err) } defer f.Close() pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } r.ParseForm() textQuery := r.Form.Get("q") re, err := regexp.Compile(textQuery) if err != nil { log.Printf("regexp.Compile: %s\n", err) return } query := index.RegexpQuery(re.Syntax) log.Printf("[%s] query: text = %s, regexp = %s\n", id, textQuery, query) t0 := time.Now() post := ix.PostingQuery(query) t1 := time.Now() fmt.Printf("[%s] postingquery done in %v, %d results\n", id, t1.Sub(t0), len(post)) files := make([]string, len(post)) for idx, fileid := range post { files[idx] = ix.Name(fileid) } t2 := time.Now() fmt.Printf("[%s] filenames collected in %v\n", id, t2.Sub(t1)) jsonFiles, err := json.Marshal(files) if err != nil { log.Printf("%s\n", err) return } t3 := time.Now() fmt.Printf("[%s] marshaling done in %v\n", id, t3.Sub(t2)) _, err = w.Write(jsonFiles) if err != nil { log.Printf("%s\n", err) return } t4 := time.Now() fmt.Printf("[%s] written in %v\n", id, t4.Sub(t3)) }
func validateQuery(query string) error { // Parse the query and see whether the resulting trigram query is // non-empty. This is to catch queries like “package:debian”. fakeUrl, err := url.Parse(query) if err != nil { return err } rewritten := search.RewriteQuery(*fakeUrl) log.Printf("rewritten query = %q\n", rewritten.String()) re, err := dcsregexp.Compile(rewritten.Query().Get("q")) if err != nil { return err } indexQuery := index.RegexpQuery(re.Syntax) log.Printf("trigram = %v, sub = %v", indexQuery.Trigram, indexQuery.Sub) if len(indexQuery.Trigram) == 0 && len(indexQuery.Sub) == 0 { return fmt.Errorf("Empty index query") } return nil }
// Handles requests to /index by compiling the q= parameter into a regular // expression (codesearch/regexp), searching the index for it and returning the // list of matching filenames in a JSON array. // TODO: This doesn’t handle file name regular expressions at all yet. // TODO: errors aren’t properly signaled to the requester func (s *server) Files(ctx context.Context, in *proto.FilesRequest) (*proto.FilesReply, error) { if *cpuProfile != "" { f, err := os.Create(*cpuProfile) if err != nil { log.Fatal(err) } defer f.Close() pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } re, err := regexp.Compile(in.Query) if err != nil { return nil, fmt.Errorf("regexp.Compile: %s\n", err) } query := index.RegexpQuery(re.Syntax) log.Printf("[%s] query: text = %s, regexp = %s\n", s.id, in.Query, query) return &proto.FilesReply{ Path: s.doPostingQuery(query), }, nil }