in pkg/query/logical/index_filter.go [119:175]
func parseCondition(cond *modelv1.Condition, indexRule *databasev1.IndexRule, expr LiteralExpr, entity tsdb.Entity) (index.Filter, []tsdb.Entity, error) {
switch cond.Op {
case modelv1.Condition_BINARY_OP_GT:
return newRange(indexRule, index.RangeOpts{
Lower: bytes.Join(expr.Bytes(), nil),
}), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_GE:
return newRange(indexRule, index.RangeOpts{
IncludesLower: true,
Lower: bytes.Join(expr.Bytes(), nil),
}), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_LT:
return newRange(indexRule, index.RangeOpts{
Upper: bytes.Join(expr.Bytes(), nil),
}), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_LE:
return newRange(indexRule, index.RangeOpts{
IncludesUpper: true,
Upper: bytes.Join(expr.Bytes(), nil),
}), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_EQ:
return newEq(indexRule, expr), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_MATCH:
return newMatch(indexRule, expr), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_NE:
return newNot(indexRule, newEq(indexRule, expr)), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_HAVING:
bb := expr.Bytes()
and := newAnd(len(bb))
for _, b := range bb {
and.append(newEq(indexRule, newBytesLiteral(b)))
}
return and, []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_NOT_HAVING:
bb := expr.Bytes()
and := newAnd(len(bb))
for _, b := range bb {
and.append(newEq(indexRule, newBytesLiteral(b)))
}
return newNot(indexRule, and), []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_IN:
bb := expr.Bytes()
or := newOr(len(bb))
for _, b := range bb {
or.append(newEq(indexRule, newBytesLiteral(b)))
}
return or, []tsdb.Entity{entity}, nil
case modelv1.Condition_BINARY_OP_NOT_IN:
bb := expr.Bytes()
or := newOr(len(bb))
for _, b := range bb {
or.append(newEq(indexRule, newBytesLiteral(b)))
}
return newNot(indexRule, or), []tsdb.Entity{entity}, nil
}
return nil, nil, errors.WithMessagef(errUnsupportedConditionOp, "index filter parses %v", cond)
}