mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-13 20:35:56 +08:00
feat: json filter bool support (#3544)
* feat: json filter bool support * fix: update json filter for bool
This commit is contained in:
parent
a8c4a91001
commit
ed809474d6
@ -12,24 +12,29 @@ const (
|
|||||||
STRING = "String"
|
STRING = "String"
|
||||||
INT64 = "Int64"
|
INT64 = "Int64"
|
||||||
FLOAT64 = "Float64"
|
FLOAT64 = "Float64"
|
||||||
|
BOOL = "Bool"
|
||||||
ARRAY_STRING = "Array(String)"
|
ARRAY_STRING = "Array(String)"
|
||||||
ARRAY_INT64 = "Array(Int64)"
|
ARRAY_INT64 = "Array(Int64)"
|
||||||
ARRAY_FLOAT64 = "Array(Float64)"
|
ARRAY_FLOAT64 = "Array(Float64)"
|
||||||
|
ARRAY_BOOL = "Array(Bool)"
|
||||||
)
|
)
|
||||||
|
|
||||||
var dataTypeMapping = map[string]string{
|
var dataTypeMapping = map[string]string{
|
||||||
"string": STRING,
|
"string": STRING,
|
||||||
"int64": INT64,
|
"int64": INT64,
|
||||||
"float64": FLOAT64,
|
"float64": FLOAT64,
|
||||||
|
"bool": BOOL,
|
||||||
"array(string)": ARRAY_STRING,
|
"array(string)": ARRAY_STRING,
|
||||||
"array(int64)": ARRAY_INT64,
|
"array(int64)": ARRAY_INT64,
|
||||||
"array(float64)": ARRAY_FLOAT64,
|
"array(float64)": ARRAY_FLOAT64,
|
||||||
|
"array(bool)": ARRAY_BOOL,
|
||||||
}
|
}
|
||||||
|
|
||||||
var arrayValueTypeMapping = map[string]string{
|
var arrayValueTypeMapping = map[string]string{
|
||||||
"array(string)": "string",
|
"array(string)": "string",
|
||||||
"array(int64)": "int64",
|
"array(int64)": "int64",
|
||||||
"array(float64)": "float64",
|
"array(float64)": "float64",
|
||||||
|
"array(bool)": "bool",
|
||||||
}
|
}
|
||||||
|
|
||||||
var jsonLogOperators = map[v3.FilterOperator]string{
|
var jsonLogOperators = map[v3.FilterOperator]string{
|
||||||
@ -74,7 +79,7 @@ func getJSONFilterKey(key v3.AttributeKey, isArray bool) (string, error) {
|
|||||||
|
|
||||||
// for non array
|
// for non array
|
||||||
keyname := fmt.Sprintf("JSON_VALUE(%s, '$.%s')", keyArr[0], strings.Join(keyArr[1:], "."))
|
keyname := fmt.Sprintf("JSON_VALUE(%s, '$.%s')", keyArr[0], strings.Join(keyArr[1:], "."))
|
||||||
if dataType != "String" {
|
if dataType != STRING {
|
||||||
keyname = fmt.Sprintf("JSONExtract(%s, '%s')", keyname, dataType)
|
keyname = fmt.Sprintf("JSONExtract(%s, '%s')", keyname, dataType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,6 +74,16 @@ var testGetJSONFilterKeyData = []struct {
|
|||||||
IsArray: true,
|
IsArray: true,
|
||||||
ClickhouseKey: "JSONExtract(JSON_QUERY(body, '$.nested_num[*].float_nums[*]'), '" + ARRAY_FLOAT64 + "')",
|
ClickhouseKey: "JSONExtract(JSON_QUERY(body, '$.nested_num[*].float_nums[*]'), '" + ARRAY_FLOAT64 + "')",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "Array Bool",
|
||||||
|
Key: v3.AttributeKey{
|
||||||
|
Key: "body.boolarray[*]",
|
||||||
|
DataType: "array(bool)",
|
||||||
|
IsJSON: true,
|
||||||
|
},
|
||||||
|
IsArray: true,
|
||||||
|
ClickhouseKey: "JSONExtract(JSON_QUERY(body, '$.boolarray[*]'), '" + ARRAY_BOOL + "')",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "String",
|
Name: "String",
|
||||||
Key: v3.AttributeKey{
|
Key: v3.AttributeKey{
|
||||||
@ -104,6 +114,16 @@ var testGetJSONFilterKeyData = []struct {
|
|||||||
IsArray: false,
|
IsArray: false,
|
||||||
ClickhouseKey: "JSONExtract(JSON_VALUE(body, '$.fraction'), '" + FLOAT64 + "')",
|
ClickhouseKey: "JSONExtract(JSON_VALUE(body, '$.fraction'), '" + FLOAT64 + "')",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "Bool",
|
||||||
|
Key: v3.AttributeKey{
|
||||||
|
Key: "body.boolkey",
|
||||||
|
DataType: "bool",
|
||||||
|
IsJSON: true,
|
||||||
|
},
|
||||||
|
IsArray: false,
|
||||||
|
ClickhouseKey: "JSONExtract(JSON_VALUE(body, '$.boolkey'), '" + BOOL + "')",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetJSONFilterKey(t *testing.T) {
|
func TestGetJSONFilterKey(t *testing.T) {
|
||||||
@ -165,6 +185,19 @@ var testGetJSONFilterData = []struct {
|
|||||||
},
|
},
|
||||||
Filter: "NOT has(JSONExtract(JSON_QUERY(body, '$.nested_num[*].float_nums[*]'), '" + ARRAY_FLOAT64 + "'), 2.200000)",
|
Filter: "NOT has(JSONExtract(JSON_QUERY(body, '$.nested_num[*].float_nums[*]'), '" + ARRAY_FLOAT64 + "'), 2.200000)",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "Array membership bool",
|
||||||
|
FilterItem: v3.FilterItem{
|
||||||
|
Key: v3.AttributeKey{
|
||||||
|
Key: "body.bool[*]",
|
||||||
|
DataType: "array(bool)",
|
||||||
|
IsJSON: true,
|
||||||
|
},
|
||||||
|
Operator: "has",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
Filter: "has(JSONExtract(JSON_QUERY(body, '$.bool[*]'), '" + ARRAY_BOOL + "'), true)",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "eq operator",
|
Name: "eq operator",
|
||||||
FilterItem: v3.FilterItem{
|
FilterItem: v3.FilterItem{
|
||||||
@ -204,6 +237,19 @@ var testGetJSONFilterData = []struct {
|
|||||||
},
|
},
|
||||||
Filter: "JSONExtract(JSON_VALUE(body, '$.status'), '" + FLOAT64 + "') = 1.100000",
|
Filter: "JSONExtract(JSON_VALUE(body, '$.status'), '" + FLOAT64 + "') = 1.100000",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "eq operator bool",
|
||||||
|
FilterItem: v3.FilterItem{
|
||||||
|
Key: v3.AttributeKey{
|
||||||
|
Key: "body.boolkey",
|
||||||
|
DataType: "bool",
|
||||||
|
IsJSON: true,
|
||||||
|
},
|
||||||
|
Operator: "=",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
Filter: "JSONExtract(JSON_VALUE(body, '$.boolkey'), '" + BOOL + "') = true",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "greater than operator",
|
Name: "greater than operator",
|
||||||
FilterItem: v3.FilterItem{
|
FilterItem: v3.FilterItem{
|
||||||
|
@ -242,6 +242,7 @@ const (
|
|||||||
AttributeKeyDataTypeArrayString AttributeKeyDataType = "array(string)"
|
AttributeKeyDataTypeArrayString AttributeKeyDataType = "array(string)"
|
||||||
AttributeKeyDataTypeArrayInt64 AttributeKeyDataType = "array(int64)"
|
AttributeKeyDataTypeArrayInt64 AttributeKeyDataType = "array(int64)"
|
||||||
AttributeKeyDataTypeArrayFloat64 AttributeKeyDataType = "array(float64)"
|
AttributeKeyDataTypeArrayFloat64 AttributeKeyDataType = "array(float64)"
|
||||||
|
AttributeKeyDataTypeArrayBool AttributeKeyDataType = "array(bool)"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (q AttributeKeyDataType) Validate() error {
|
func (q AttributeKeyDataType) Validate() error {
|
||||||
@ -297,7 +298,7 @@ func (a AttributeKey) CacheKey() string {
|
|||||||
|
|
||||||
func (a AttributeKey) Validate() error {
|
func (a AttributeKey) Validate() error {
|
||||||
switch a.DataType {
|
switch a.DataType {
|
||||||
case AttributeKeyDataTypeBool, AttributeKeyDataTypeInt64, AttributeKeyDataTypeFloat64, AttributeKeyDataTypeString, AttributeKeyDataTypeArrayFloat64, AttributeKeyDataTypeArrayString, AttributeKeyDataTypeArrayInt64, AttributeKeyDataTypeUnspecified:
|
case AttributeKeyDataTypeBool, AttributeKeyDataTypeInt64, AttributeKeyDataTypeFloat64, AttributeKeyDataTypeString, AttributeKeyDataTypeArrayFloat64, AttributeKeyDataTypeArrayString, AttributeKeyDataTypeArrayInt64, AttributeKeyDataTypeArrayBool, AttributeKeyDataTypeUnspecified:
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("invalid attribute dataType: %s", a.DataType)
|
return fmt.Errorf("invalid attribute dataType: %s", a.DataType)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user