in internal/repo/search_common/search_repo.go [494:576]
func (sr *searchRepo) parseResult(ctx context.Context, res []map[string][]byte, words []string) (resp []*schema.SearchResult, err error) {
questionIDs := make([]string, 0)
userIDs := make([]string, 0)
resultList := make([]*schema.SearchResult, 0)
for _, r := range res {
questionIDs = append(questionIDs, string(r["question_id"]))
userIDs = append(userIDs, string(r["user_id"]))
tp, _ := time.ParseInLocation("2006-01-02 15:04:05", string(r["created_at"]), time.Local)
var ID = string(r["id"])
var QuestionID = string(r["question_id"])
if handler.GetEnableShortID(ctx) {
ID = uid.EnShortID(ID)
QuestionID = uid.EnShortID(QuestionID)
}
object := &schema.SearchObject{
ID: ID,
QuestionID: QuestionID,
Title: string(r["title"]),
UrlTitle: htmltext.UrlTitle(string(r["title"])),
Excerpt: htmltext.FetchMatchedExcerpt(string(r["parsed_text"]), words, "...", 100),
CreatedAtParsed: tp.Unix(),
UserInfo: &schema.SearchObjectUser{
ID: string(r["user_id"]),
},
Tags: make([]*schema.TagResp, 0),
VoteCount: converter.StringToInt(string(r["vote_count"])),
Accepted: string(r["accepted"]) == "2",
AnswerCount: converter.StringToInt(string(r["answer_count"])),
}
objectKey, err := obj.GetObjectTypeStrByObjectID(string(r["id"]))
if err != nil {
continue
}
switch objectKey {
case "question":
for k, v := range entity.AdminQuestionSearchStatus {
if v == converter.StringToInt(string(r["status"])) {
object.StatusStr = k
break
}
}
case "answer":
for k, v := range entity.AdminAnswerSearchStatus {
if v == converter.StringToInt(string(r["status"])) {
object.StatusStr = k
break
}
}
}
resultList = append(resultList, &schema.SearchResult{
ObjectType: objectKey,
Object: object,
})
}
tagsMap, err := sr.tagCommon.BatchGetObjectTag(ctx, questionIDs)
if err != nil {
return nil, err
}
userInfoMap, err := sr.userCommon.BatchUserBasicInfoByID(ctx, userIDs)
if err != nil {
return nil, err
}
for _, item := range resultList {
tags, ok := tagsMap[item.Object.QuestionID]
if ok {
item.Object.Tags = tags
}
if userInfo := userInfoMap[item.Object.UserInfo.ID]; userInfo != nil {
item.Object.UserInfo.Username = userInfo.Username
item.Object.UserInfo.DisplayName = userInfo.DisplayName
item.Object.UserInfo.Rank = userInfo.Rank
item.Object.UserInfo.Status = userInfo.Status
}
}
return resultList, nil
}