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
}