add measurement recommend api

This commit is contained in:
douxu 2025-09-29 16:37:38 +08:00
parent 453e6f9851
commit 5d02ca9fca
5 changed files with 62 additions and 8 deletions

View File

@ -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

View File

@ -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,
},
})
}

View File

@ -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
}
}

View File

@ -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"`
}

View File

@ -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)
}