search.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package main
  2. import (
  3. "bytes"
  4. "log"
  5. "net/http"
  6. "regexp"
  7. "time"
  8. )
  9. type Segment struct {
  10. Source, Target string
  11. }
  12. func (s *Segment) Clean() {
  13. re := regexp.MustCompile("</?seg>")
  14. s.Source = re.ReplaceAllString(s.Source, "")
  15. s.Target = re.ReplaceAllString(s.Target, "")
  16. }
  17. type CleanedResults struct {
  18. TMName string
  19. Segments []Segment
  20. }
  21. type SearchResults struct {
  22. SearchPhrase string
  23. Results []CleanedResults
  24. TotalResults int
  25. }
  26. type ResultsFromServer struct {
  27. ConcResult []struct {
  28. ConcordanceTextRanges []struct {
  29. Length, Start int
  30. }
  31. ConcordanceTranslationRanges []string
  32. Length, StartPos int
  33. TMEntry struct {
  34. SourceSegment, TargetSegment string
  35. }
  36. }
  37. ConcTransResult, Errors []string
  38. TotalConcResult int
  39. }
  40. func PostQuery(requestURL string, searchJSON []byte) *http.Response {
  41. req, err := http.NewRequest("POST", requestURL, bytes.NewBuffer(searchJSON))
  42. req.Header.Set("Content-Type", "application/json")
  43. client := &http.Client{}
  44. resp, err := client.Do(req)
  45. if err != nil {
  46. log.Printf("error posting query: %v", err)
  47. }
  48. return resp
  49. }
  50. func (app *Application) Search(TMs []TM, text string) SearchResults {
  51. searchString := "{ \"SearchExpression\": [ \"" + text + "\" ]}"
  52. searchJSON := []byte(searchString)
  53. tmURL := app.BaseURL + "tms/"
  54. var finalResults SearchResults
  55. finalResults.SearchPhrase = text
  56. var results []CleanedResults
  57. for _, tm := range TMs {
  58. getTM := tmURL + tm.TMGuid
  59. concordanceURL := getTM + "/concordance"
  60. requestURL := concordanceURL + app.AuthString
  61. resp := PostQuery(requestURL, searchJSON)
  62. defer resp.Body.Close()
  63. if resp.StatusCode == 401 {
  64. time.Sleep(app.Delay)
  65. app.Login()
  66. return app.Search(TMs, text)
  67. }
  68. var tempResults ResultsFromServer
  69. JsonDecoder(resp.Body, &tempResults)
  70. if tempResults.TotalConcResult > 0 {
  71. var tmResults CleanedResults
  72. //Allocating Segments array beforehand
  73. tmResults.Segments = make([]Segment, 0, tempResults.TotalConcResult)
  74. tmResults.TMName = tm.FriendlyName
  75. for _, result := range tempResults.ConcResult {
  76. segment := Segment{result.TMEntry.SourceSegment, result.TMEntry.TargetSegment}
  77. segment.Clean()
  78. tmResults.Segments = append(tmResults.Segments, segment)
  79. }
  80. results = append(results, tmResults)
  81. finalResults.TotalResults += len(tmResults.Segments)
  82. }
  83. }
  84. finalResults.Results = results
  85. return finalResults
  86. }