in pkg/query/logical/stream/index_filter.go [101:165]
func parseConditionToFilter(cond *modelv1.Condition, indexRule *databasev1.IndexRule,
expr logical.LiteralExpr, entity []*modelv1.TagValue,
) (index.Filter, [][]*modelv1.TagValue, error) {
switch cond.Op {
case modelv1.Condition_BINARY_OP_GT:
return newRange(indexRule, expr.RangeOpts(false, false, false)), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_GE:
return newRange(indexRule, expr.RangeOpts(false, true, false)), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_LT:
return newRange(indexRule, expr.RangeOpts(true, false, false)), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_LE:
return newRange(indexRule, expr.RangeOpts(true, false, true)), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_EQ:
return newEq(indexRule, expr), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_MATCH:
return newMatch(indexRule, expr, cond.MatchOption), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_NE:
return newNot(indexRule, newEq(indexRule, expr)), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_HAVING:
ee := expr.SubExprs()
l := len(ee)
if l < 1 {
return ENode, [][]*modelv1.TagValue{entity}, nil
}
and := newAnd(l)
for i := range ee {
and.append(newEq(indexRule, ee[i]))
}
return and, [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_NOT_HAVING:
ee := expr.SubExprs()
l := len(ee)
if l < 1 {
return ENode, [][]*modelv1.TagValue{entity}, nil
}
and := newAnd(l)
for i := range ee {
and.append(newEq(indexRule, ee[i]))
}
return newNot(indexRule, and), [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_IN:
ee := expr.SubExprs()
l := len(ee)
if l < 1 {
return ENode, [][]*modelv1.TagValue{entity}, nil
}
or := newOr(l)
for i := range ee {
or.append(newEq(indexRule, ee[i]))
}
return or, [][]*modelv1.TagValue{entity}, nil
case modelv1.Condition_BINARY_OP_NOT_IN:
ee := expr.SubExprs()
l := len(ee)
if l < 1 {
return ENode, [][]*modelv1.TagValue{entity}, nil
}
or := newOr(l)
for i := range ee {
or.append(newEq(indexRule, ee[i]))
}
return newNot(indexRule, or), [][]*modelv1.TagValue{entity}, nil
}
return nil, nil, errors.WithMessagef(logical.ErrUnsupportedConditionOp, "index filter parses %v", cond)
}