func parseExprOrEntity()

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)
}