diff --git a/handler/measurement_load.go b/handler/measurement_load.go index 67e4bb1..ee0d6e0 100644 --- a/handler/measurement_load.go +++ b/handler/measurement_load.go @@ -13,7 +13,7 @@ import ( "github.com/gin-gonic/gin" ) -// MeasurementGetHandler retrieves the value of measurement data +// MeasurementGetHandler define measurement query API func MeasurementGetHandler(c *gin.Context) { var request network.MeasurementGetRequest diff --git a/handler/measurement_recommend.go b/handler/measurement_recommend.go new file mode 100644 index 0000000..b86bd28 --- /dev/null +++ b/handler/measurement_recommend.go @@ -0,0 +1,48 @@ +// Package handler provides HTTP handlers for various endpoints. +package handler + +import ( + "net/http" + + "modelRT/logger" + "modelRT/model" + "modelRT/network" + + "github.com/gin-gonic/gin" +) + +// MeasurementRecommendHandler define measurement recommend API +func MeasurementRecommendHandler(c *gin.Context) { + var request network.MeasurementRecommendRequest + + recommends, err := model.RedisSearchRecommend(c, request.Input) + if err != nil { + logger.Error(c, "failed to get recommend data from redis", "input", request.Input, "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusInternalServerError, + Msg: err.Error(), + PayLoad: map[string]interface{}{ + "input": request.Input, + }, + }) + return + } + + var minOffset int + for index, recommend := range recommends { + offset := model.GetLongestCommonPrefixLength(request.Input, recommend) + if index == 0 || offset < minOffset { + minOffset = offset + } + } + + c.JSON(http.StatusOK, network.SuccessResponse{ + Code: http.StatusOK, + Msg: "success", + PayLoad: map[string]interface{}{ + "input": request.Input, + "offset": minOffset, + "recommended_list": recommends, + }, + }) +} diff --git a/model/object.go b/model/redis_recommend.go similarity index 95% rename from model/object.go rename to model/redis_recommend.go index 194f16a..d42cbd8 100644 --- a/model/object.go +++ b/model/redis_recommend.go @@ -154,15 +154,15 @@ func getConstantsKeyByLength(inputLen int) string { } // GetLongestCommonPrefixLength define func of get longest common prefix length between two strings -func GetLongestCommonPrefixLength(s1 string, s2 string) int { - // TODO 增加对特殊字符串例如 "" 的处理 - minLen := len(s1) - if len(s2) < minLen { - minLen = len(s2) +func GetLongestCommonPrefixLength(input string, recommendResult string) int { + if input == "" { + return 0 } - for i := 0; i < minLen; i++ { - if s1[i] != s2[i] { + minLen := min(len(input), len(recommendResult)) + + for i := range minLen { + if input[i] != recommendResult[i] { return i } } diff --git a/network/measurement_request.go b/network/measurement_request.go index db78655..a6ebbeb 100644 --- a/network/measurement_request.go +++ b/network/measurement_request.go @@ -6,3 +6,8 @@ type MeasurementGetRequest struct { MeasurementID int64 `json:"measurement_id"` MeasurementToken string `json:"token"` } + +// MeasurementRecommendRequest defines the request payload for an measurement recommend +type MeasurementRecommendRequest struct { + Input string `json:"input"` +} diff --git a/router/measurement.go b/router/measurement.go index bb73c35..19799e1 100644 --- a/router/measurement.go +++ b/router/measurement.go @@ -13,4 +13,5 @@ func registerMeasurementRoutes(rg *gin.RouterGroup, clientToken string) { g := rg.Group("/measurement/") rg.Use(middleware.SetTokenMiddleware(clientToken)) g.GET("load", handler.MeasurementGetHandler) + g.GET("recommend", handler.MeasurementRecommendHandler) }