in pkg/query/logical/parser.go [28:90]
func ParseExprOrEntity(entityDict map[string]int, entity []*modelv1.TagValue, cond *modelv1.Condition) (LiteralExpr, [][]*modelv1.TagValue, error) {
entityIdx, ok := entityDict[cond.Name]
if ok && cond.Op != modelv1.Condition_BINARY_OP_EQ && cond.Op != modelv1.Condition_BINARY_OP_IN {
ok = false
}
switch v := cond.Value.Value.(type) {
case *modelv1.TagValue_Str:
if ok {
parsedEntity := make([]*modelv1.TagValue, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = cond.Value
return nil, [][]*modelv1.TagValue{parsedEntity}, nil
}
return str(v.Str.GetValue()), nil, nil
case *modelv1.TagValue_StrArray:
if ok && cond.Op == modelv1.Condition_BINARY_OP_IN {
entities := make([][]*modelv1.TagValue, len(v.StrArray.Value))
for i, va := range v.StrArray.Value {
parsedEntity := make([]*modelv1.TagValue, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = &modelv1.TagValue{
Value: &modelv1.TagValue_Str{
Str: &modelv1.Str{
Value: va,
},
},
}
entities[i] = parsedEntity
}
return nil, entities, nil
}
return newStrArrLiteral(v.StrArray.GetValue()), nil, nil
case *modelv1.TagValue_Int:
if ok {
parsedEntity := make([]*modelv1.TagValue, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = cond.Value
return nil, [][]*modelv1.TagValue{parsedEntity}, nil
}
return newInt64Literal(v.Int.GetValue()), nil, nil
case *modelv1.TagValue_IntArray:
if ok && cond.Op == modelv1.Condition_BINARY_OP_IN {
entities := make([][]*modelv1.TagValue, len(v.IntArray.Value))
for i, va := range v.IntArray.Value {
parsedEntity := make([]*modelv1.TagValue, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = &modelv1.TagValue{
Value: &modelv1.TagValue_Int{
Int: &modelv1.Int{
Value: va,
},
},
}
entities[i] = parsedEntity
}
return nil, entities, nil
}
return newInt64ArrLiteral(v.IntArray.GetValue()), nil, nil
case *modelv1.TagValue_Null:
return newNullLiteral(), nil, nil
}
return nil, nil, errors.WithMessagef(ErrUnsupportedConditionValue, "index filter parses %v", cond)
}