func BuildTagFilter()

in pkg/query/logical/tag_filter.go [80:126]


func BuildTagFilter(criteria *modelv1.Criteria, entityDict map[string]int, indexChecker IndexChecker, hasGlobalIndex bool) (TagFilter, error) {
	if criteria == nil {
		return DummyFilter, nil
	}
	switch criteria.GetExp().(type) {
	case *modelv1.Criteria_Condition:
		cond := criteria.GetCondition()
		expr, err := parseExpr(cond.Value)
		if err != nil {
			return nil, err
		}
		if ok, _ := indexChecker.IndexDefined(cond.Name); ok {
			return DummyFilter, nil
		}
		if _, ok := entityDict[cond.Name]; ok {
			return DummyFilter, nil
		}
		return parseFilter(cond, expr)
	case *modelv1.Criteria_Le:
		le := criteria.GetLe()
		left, err := BuildTagFilter(le.Left, entityDict, indexChecker, hasGlobalIndex)
		if err != nil {
			return nil, err
		}
		right, err := BuildTagFilter(le.Right, entityDict, indexChecker, hasGlobalIndex)
		if err != nil {
			return nil, err
		}
		if left == DummyFilter && right == DummyFilter {
			return DummyFilter, nil
		}
		switch le.Op {
		case modelv1.LogicalExpression_LOGICAL_OP_AND:
			and := newAndLogicalNode(2)
			and.append(left).append(right)
			return and, nil
		case modelv1.LogicalExpression_LOGICAL_OP_OR:
			if hasGlobalIndex {
				return nil, errors.WithMessage(errUnsupportedLogicalOperation, "global index doesn't support OR")
			}
			or := newOrLogicalNode(2)
			or.append(left).append(right)
			return or, nil
		}
	}
	return nil, errInvalidCriteriaType
}