in pkg/query/logical/index_filter.go [177:233]
func parseExprOrEntity(entityDict map[string]int, entity tsdb.Entity, cond *modelv1.Condition) (LiteralExpr, []tsdb.Entity, error) {
entityIdx, ok := entityDict[cond.Name]
if ok && cond.Op != modelv1.Condition_BINARY_OP_EQ && cond.Op != modelv1.Condition_BINARY_OP_IN {
return nil, nil, errors.WithMessagef(errUnsupportedConditionOp, "tag belongs to the entity only supports EQ or IN operation in condition(%v)", cond)
}
switch v := cond.Value.Value.(type) {
case *modelv1.TagValue_Str:
if ok {
parsedEntity := make(tsdb.Entity, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = []byte(v.Str.GetValue())
return nil, []tsdb.Entity{parsedEntity}, nil
}
return str(v.Str.GetValue()), nil, nil
case *modelv1.TagValue_StrArray:
if ok && cond.Op == modelv1.Condition_BINARY_OP_IN {
entities := make([]tsdb.Entity, len(v.StrArray.Value))
for i, va := range v.StrArray.Value {
parsedEntity := make(tsdb.Entity, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = []byte(va)
entities[i] = parsedEntity
}
return nil, entities, nil
}
return &strArrLiteral{
arr: v.StrArray.GetValue(),
}, nil, nil
case *modelv1.TagValue_Int:
if ok {
parsedEntity := make(tsdb.Entity, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = convert.Int64ToBytes(v.Int.GetValue())
return nil, []tsdb.Entity{parsedEntity}, nil
}
return &int64Literal{
int64: v.Int.GetValue(),
}, nil, nil
case *modelv1.TagValue_IntArray:
if ok && cond.Op == modelv1.Condition_BINARY_OP_IN {
entities := make([]tsdb.Entity, len(v.IntArray.Value))
for i, va := range v.IntArray.Value {
parsedEntity := make(tsdb.Entity, len(entity))
copy(parsedEntity, entity)
parsedEntity[entityIdx] = convert.Int64ToBytes(va)
entities[i] = parsedEntity
}
return nil, entities, nil
}
return &int64ArrLiteral{
arr: v.IntArray.GetValue(),
}, nil, nil
case *modelv1.TagValue_Null:
return nullLiteralExpr, nil, nil
}
return nil, nil, errors.WithMessagef(errUnsupportedConditionValue, "index filter parses %v", cond)
}