Skip to content

Commit

Permalink
Improve search functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
MrGoumX committed Nov 5, 2020
1 parent 73d917a commit d8ca916
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 16 deletions.
2 changes: 1 addition & 1 deletion handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func handlerTube(w http.ResponseWriter, r *http.Request) {
_, _ = io.WriteString(w, `{"result":true}`)
return
case "search":
content := searchTube(server, tube, r.URL.Query().Get("limit"), r.URL.Query().Get("searchStr"))
content := searchTube(server, tube, r.URL.Query().Get("limit"), r.URL.Query().Get("id"), r.URL.Query().Get("state"), r.URL.Query().Get("searchStr"))
_, _ = io.WriteString(w, tplTube(content, server, tube))
return
case "addSample":
Expand Down
67 changes: 55 additions & 12 deletions lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,13 +263,14 @@ func clearTubes(server string, data url.Values) {

// searchTube search job by given search string in ready, delayed and buried
// stats.
func searchTube(server string, tube string, limit string, searchStr string) string {
func searchTube(server string, tube string, limit string, tubeID string, state string, searchStr string) string {
var (
bstkConn *beanstalk.Conn
bstkConnStats map[string]string
err error
result = []SearchResult{}
searchLimit int
searchID uint64
statsFilter = []string{"ready", "delayed", "buried"}
table = currentTubeJobsSummaryTable(server, tube)
totalJobs, id uint64
Expand All @@ -290,24 +291,47 @@ func searchTube(server string, tube string, limit string, searchStr string) stri
if totalJobs, err = strconv.ParseUint(bstkConnStats["total-jobs"], 10, 64); err != nil {
return table
}
// Get ready stat job total
for _, state := range statsFilter {
var cnt int
for id = totalJobs; id > 0; id-- {
if cnt >= searchLimit {
continue
}
ret := searchTubeInStats(tube, searchStr, state, bstkConn, id)
if ret != nil {
result = append(result, *ret)
cnt++
if tubeID != "" {
searchID, err = strconv.ParseUint(tubeID, 10, 64)
if err != nil {
return table
}
ret := searchTubeByID(tube, searchID, bstkConn)
if ret != nil {
result = append(result, *ret)
}
} else {
// Get ready stat job total
if state != "" {
ret := limitResults(tube, searchStr, state, searchLimit, id, totalJobs, bstkConn)
result = append(result, *ret...)
} else {
for _, state := range statsFilter {
ret := limitResults(tube, searchStr, state, searchLimit, id, totalJobs, bstkConn)
result = append(result, *ret...)
}
}
}
bstkConn.Close()
return table + currentTubeSearchResults(server, tube, limit, searchStr, result)
}

func limitResults(tube, searchStr, state string, searchLimit int, id, totalJobs uint64, bstkConn *beanstalk.Conn) *[]SearchResult {
var cnt int
var result = []SearchResult{}
for id = totalJobs; id > 0; id-- {
if cnt >= searchLimit {
continue
}
ret := searchTubeInStats(tube, searchStr, state, bstkConn, id)
if ret != nil {
result = append(result, *ret)
cnt++
}
}
return &result
}

// searchTubeInStats search job in tube by given stats.
func searchTubeInStats(tube, searchStr, stat string, bstkConn *beanstalk.Conn, id uint64) *SearchResult {
jobStats, err := bstkConn.StatsJob(id)
Expand All @@ -331,3 +355,22 @@ func searchTubeInStats(tube, searchStr, stat string, bstkConn *beanstalk.Conn, i
Data: string(readyBody),
}
}

func searchTubeByID(tube string, searchID uint64, bstkConn *beanstalk.Conn) *SearchResult {
jobStats, err := bstkConn.StatsJob(searchID)
if err != nil {
return nil
}
if jobStats["tube"] != tube {
return nil
}
readyBody, err := bstkConn.Peek(searchID)
if err != nil {
return nil
}
return &SearchResult{
ID: searchID,
State: jobStats["state"],
Data: string(readyBody),
}
}
7 changes: 4 additions & 3 deletions tplSearchTube.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ func tplSearchTube(server string, tube string, state string) string {
buf.WriteString(server)
buf.WriteString(`"/><input type="hidden" name="tube" value="`)
buf.WriteString(tube)
buf.WriteString(`"/><input type="hidden" name="state" value="`)
buf.WriteString(state)
buf.WriteString(`"/><input type="hidden" name="action" value="search"/><input type="hidden" name="limit" value="`)
buf.WriteString(strconv.Itoa(selfConf.SearchResultLimit))
buf.WriteString(`"/><div class="form-group"><input type="text" class="form-control input-sm search-query" name="searchStr" placeholder="Search this tube"></div></form>`)
buf.WriteString(`"/><div class="form-group"><select class="form-control input-sm search-query" style="margin-right: 10px;" id="state" name="state"><option value="" disabled selected>Select state</option><option>ready</option><option>delayed</option><option>buried</option></select>`)
buf.WriteString(`<input type="text" class="form-control input-sm search-query" style="margin-right: 10px;" name="id" placeholder="Bean ID"/>`)
buf.WriteString(`<input type="text" class="form-control input-sm search-query" style="margin-right: 10px;" name="searchStr" placeholder="Search this tube"/>`)
buf.WriteString(`<button type="submit" class="btn btn-info btn-sm">Search</button></div></form>`)
return buf.String()
}

0 comments on commit d8ca916

Please sign in to comment.