in internal/pkg/eql/compare.go [117:218]
func compareNEQ(left, right operand) (bool, error) {
switch v := left.(type) {
case *null:
_, ok := right.(*null)
if ok {
return false, nil
}
return true, nil
case bool:
rV, ok := right.(bool)
if !ok {
return true, nil
}
if rV == v {
return false, nil
}
return true, nil
case int:
switch rv := right.(type) {
case *null:
return true, nil
case int:
return v != rv, nil
case float64:
// TODO: check overflow, weird things will happen with precision here.
// use modf
return float64(v) != rv, nil
default:
return false, fmt.Errorf(
"compare: ==, incompatible type to compare both operands must be numbers, left=%T, right=%T",
left,
right,
)
}
case float64:
switch rv := right.(type) {
case *null:
return true, nil
case int:
return v != float64(rv), nil
case float64:
return v != rv, nil
default:
return false, fmt.Errorf(
"compare: ==, incompatible type to compare both operands must be numbers, left=%T, right=%T",
left,
right,
)
}
case string:
rV, ok := right.(string)
if !ok {
return true, nil
}
if rV == v {
return false, nil
}
return true, nil
case []interface{}:
rV, ok := right.([]interface{})
if !ok {
return true, nil
}
if len(v) != len(rV) {
return true, nil
}
for i := range v {
b, err := compareNEQ(v[i], rV[i])
if err != nil {
return false, err
}
if b {
return true, nil
}
}
return false, nil
case map[string]interface{}:
rV, ok := right.(map[string]interface{})
if !ok {
return true, nil
}
if !keysEqual(v, rV) {
return true, nil
}
for i := range v {
b, err := compareNEQ(v[i], rV[i])
if err != nil {
return false, err
}
if b {
return true, nil
}
}
return false, nil
default:
return false, fmt.Errorf(
"compare: !=, incompatible type to compare, left=%T, right=%T",
left,
right,
)
}
}