2022-07-13 15:42:13 +05:30

101 lines
2.2 KiB
Go

package logs
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"strings"
"go.signoz.io/query-service/model"
)
var operatorMapping = map[string]string{
"eq": "=",
"neq": "!=",
"lt": "<",
"gt": ">",
"lte": "<=",
"gte": ">=",
"in": "in",
"like": "like",
"ilike": "ilike",
}
func arrayToMap(fields []model.LogField) map[string]model.LogField {
res := map[string]model.LogField{}
for _, field := range fields {
res[field.Name] = field
}
return res
}
func ParseFilterParams(r *http.Request) (*model.LogsFilterParams, error) {
res := model.LogsFilterParams{
Limit: 30,
OrderBy: "timestamp",
Order: "desc",
}
var err error
params := r.URL.Query()
filters := []model.LogFilter{}
if val, ok := params["limit"]; ok {
res.Limit, err = strconv.Atoi(val[0])
if err != nil {
return nil, err
}
}
if val, ok := params["orderBy"]; ok {
res.OrderBy = val[0]
}
if val, ok := params["order"]; ok {
res.Order = val[0]
}
if val, ok := params["filter"]; ok {
err := json.Unmarshal([]byte(val[0]), &filters)
if err != nil {
return nil, err
}
}
res.Filters = filters
return &res, nil
}
func ParseLogFilter(allFields *model.GetFieldsResponse, filters *[]model.LogFilter) (*string, error) {
fLen := len(*filters)
if fLen <= 0 {
return nil, nil
}
selectedFieldsLookup := arrayToMap(allFields.Selected)
interestingFieldLookup := arrayToMap(allFields.Interesting)
filterSql := ""
for fIndx := 0; fIndx < fLen; fIndx++ {
filter := (*filters)[fIndx]
fieldSQLName := filter.Column
if _, ok := selectedFieldsLookup[filter.Column]; !ok {
if field, ok := interestingFieldLookup[filter.Column]; ok {
fieldSQLName = fmt.Sprintf("%s_%s_value[indexOf(%s_%s_key, '%s')]", field.Type, strings.ToLower(field.DataType), field.Type, strings.ToLower(field.DataType), filter.Column)
} else {
return nil, fmt.Errorf("field not found for filtering")
}
}
filterSql += "("
vLen := len(filter.Value)
for i := 0; i < vLen; i++ {
filterSql += fmt.Sprintf("%s%s'%v'", fieldSQLName, operatorMapping[filter.Operation], filter.Value[i])
if i != vLen-1 {
filterSql += " or "
}
}
filterSql += ")"
if fIndx != fLen-1 {
filterSql += " and "
}
}
return &filterSql, nil
}